3

テーブルの監査証跡を作成しようとしています。主キー。既に複合外部キーの一部であるEFプロパティに2番目の外部キーを追加する方法

ここに私がしたいことの単純化された例があります。

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

エンティティのための私のコードは次のよう現在されています。最終的に私は、添付GiftIdeaを経由することなく、AuditGiftIdeaオブジェクトから人を参照できるようにしたい

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; } 
} 

だから私はこの試みた:

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 
} 

をしかし、私は、「複製 『のForeignKey』属性」のコンパイル時にエラーが発生します。

どうすればこの設定を行うことができますか?

+0

FK(「GiftIdea」)を保持し、Gift IdeaテーブルがFK to Personを強制するのはなぜですか? – Vlad274

+0

@ Vlad274私は主にAuditGiftIdea(AuditGiftIdea.GiftIdea.PersonではなくAuditGiftIdea.Person) – hobwell

答えて

1

ForeignKeyAttributeAllowMultiple = falseとマークされているため、データアノテーションではできません。

しかし、あなたが流暢APIとすることを設定することができます:あなたはドン場合

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

    base.OnModelCreating(modelBuilder); 
} 

新しいFKは、円形のカスケードパスとEFを作成しているので、あなたは、オフカスケード削除を有効にする必要があり注意が」エラーがスローされますそれをしないでください。これは、Personレコードの削除に問題がある可能性があることを意味します。AuditGiftIdeaテーブルから関連するレコードを手動で削除する必要があります。そのFKを導入する前に慎重に考えてください。

+0

を介して直接その人にアクセスできることに興味がありました。カスケード削除に関するあなたの注意は、私が考慮しなかった点を上げました。元のレコードが削除されても監査証跡を保持したいので、監査レコードを監査対象のレコードに結び付けない方がいいでしょう。私はこれが他の場合に有用なテクニックであると考えているので、洞察力に感謝します! – hobwell

関連する問題