如何向已经是复合外键的EF属性中添加第二个外键。

3
我正在尝试为一个表创建审计跟踪,方法是创建该表的副本,并将额外的日期作为主键的一部分。

以下是我想要做的简化示例。

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

我的实体代码目前如下:

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

最终,我希望能够在不通过附加的GiftIdea的情况下引用AuditGiftIdea对象中的Person。因此,我尝试了以下方法:
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属性重复”的错误。
我该如何完成这个设置?

为什么不直接保留FK(“GiftIdea”),并相信礼物想法表将强制执行到人的FK? - Vlad274
@Vlad274 我主要是希望能够直接通过 AuditGiftIdea 访问到 Person (例如 AuditGiftIdea.Person 而不是 AuditGiftIdea.GiftIdea.Person)。 - hobwell
1个回答

1

您不能使用数据注释来实现此操作,因为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之前,请仔细考虑。

那个完美地运作了。你提到的级联删除引发了我没有考虑过的问题。最好不要将审计记录与被审计的记录绑定在一起,因为如果原始记录被删除,我仍然希望保留审计轨迹。感谢你的洞察力,我期待在其他情况下也能使用这个技巧! - hobwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接