3

Bir tablo için bir denetim izi oluşturmaya çalışıyorum. birincil anahtar.Bileşik bir yabancı anahtarın parçası olan bir EF özelliğine ikinci bir yabancı anahtar nasıl eklenir?

İşte yapmak istediklerimin basitleştirilmiş bir örneğidir.

public class Person 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

public class GiftIdea 
{ 
    [Key, Column(Order:0), ForeignKey("Person")] 
    public int PersonID { get; set; } 
    [Key, Column(Order:1)] 
    public DateTime RecordDate { get; set; } 
    public string Description { get; set; } 
    public string Occasion { get; set; } 

    //Linked Entities 
    public virtual Person Person { get; set; } 
} 

public class AuditGiftIdea 
{ 
    [Key, Column(Order:0), ForeignKey("GiftIdea")] 
    public int PersonID { get; set; } 
    [Key, Column(Order:1), ForeignKey("GiftIdea")] 
    public DateTime RecordDate { get; set; } 
    [Key, Column(Order:2)] 
    public DateTime AuditRecordDate { get; set; } 
    public string Description { get; set; } 
    public string Occasion { get; set; } 

    //Linked Entities 
    public virtual GiftIdea GiftIdea { get; set; } 
} 

Sonuçta ben ekli GiftIdea aracılığıyla gitmek zorunda kalmadan bir AuditGiftIdea nesneden bir Kişiyi başvuru yapabilmek istiyor şu şekildedir: varlıklar için

a diagram of the relationships I want to create in some EF entities

Kodum şu anda.

Yani bu çalıştı:

public class AuditGiftIdeas 
{ 
    [Key, Column(Order:0), ForeignKey("GiftIdea"), ForeignKey("Person")] //Extra Foreign Key 
    public int PersonID { get; set; } 
    [Key, Column(Order:1), ForeignKey("GiftIdea")] 
    public DateTime RecordDate { get; set; } 
    [Key, Column(Order:2)] 
    public DateTime AuditRecordDate { get; set; } 
    public string Description { get; set; } 
    public string Occasion { get; set; } 

    //Linked Entities 
    public virtual GiftIdea GiftIdea { get; set; } 
    public virtual Person Person { get; set; } //Access to desired object 
} 

Ama "Yinelenen 'ForeignKey' özelliği" bir derleme zamanı hatası alıyorum.

Bu kurulumu nasıl yapabilirim?

+0

Neden FK ("GiftIdea") yi saklamıyorsunuz ve Hediyelik Fikirler tablosunun FK'yi Kişiye uygulayacağına güvenmiyorsunuz? – Vlad274

+0

@ Vlad274 Ben öncelikle insana AuditGiftIdea (örneğin AuditGiftIdea.GiftIdea.Person yerine AuditGiftIdea.Person) üzerinden doğrudan erişebilmeyi düşünüyordum. – hobwell

cevap

1

ForeignKeyAttributeAllowMultiple = false ile işaretlendiğinden, bunu veri ek açıklamalarıyla yapamazsınız.

Ama Akıcı API ile bu yapılandırabilirsiniz:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<AuditGiftIdea>() 
     .HasRequired(t => t.Person).WithMany() 
     .HasForeignKey(t => t.PersonID) 
     .WillCascadeOnDelete(false); 

    base.OnModelCreating(modelBuilder); 
} 

Not yeni FK dairesel kaskad yolunu yaratıyor ve 'don EF hata atmak olacağından, çağlayan kapalı silmek açmanız gerekir Bunu yap. Bu da sizin Person kayıtlarınızı silmeyle ilgili bir sorun yaşayabileceğiniz anlamına gelir; AuditGiftIdea tablosundan ilgili kayıtları manuel olarak silmeniz gerekir. Bu FK'yi tanıtmadan önce dikkatlice düşünün.

+0

Mükemmel bir şekilde çalıştı. Cascade silmeyle ilgili notunuz, dikkate almadığım bir nokta ortaya çıkardı. Denetim kayıtlarının orijinal kayıtlar silinirse denetim izini hala devam ettirmek istediğimden beri denetlenen kayıtlara BAĞLAMIYORUM. Diğer durumlarda faydalı bir teknik olmasını beklediğim için içgörü için teşekkürler! – hobwell

İlgili konular