簡體   English   中英

如何將第二個外鍵添加到EF屬性中,該屬性已經是復合外鍵的一部分

[英]How to add a second foreign key to an EF property which is part of a composite foreign key already

我正在嘗試通過創建該表的副本來創建表的審計跟蹤,該表包含作為主鍵一部分的額外日期。

這是我想要做的簡化示例。

我想在一些EF實體中創建的關系圖

我的實體代碼目前如下:

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

最終,我希望能夠從AuditGiftIdea對象引用Person,而無需通過附加的GiftIdea。

所以我嘗試了這個:

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
}

但是我得到了“Duplicate'OfternKey'屬性的編譯時錯誤”。

我該如何完成此設置?

您無法使用數據注釋執行此操作,因為ForeignKeyAttribute標記為AllowMultiple = false

但您可以使用Fluent 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之前要仔細考慮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM