如何将第二个外键添加到已经是复合外键一部分的 EF 属性
How to add a second foreign key to an EF property which is part of a composite foreign key already
我正在尝试通过创建 table 的副本来为 table 创建审计跟踪,其中包括一个额外的日期作为主键的一部分。
这是我想要做的事情的简化示例。
我目前的实体代码如下:
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 对象中引用一个人,而不必通过附加的 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 'ForeignKey' attribute" 的编译时错误。
如何完成此设置?
您不能使用数据注释来做到这一点,因为 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
table 中手动删除相关记录。所以介绍那个FK前请三思。
我正在尝试通过创建 table 的副本来为 table 创建审计跟踪,其中包括一个额外的日期作为主键的一部分。
这是我想要做的事情的简化示例。
我目前的实体代码如下:
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 对象中引用一个人,而不必通过附加的 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 'ForeignKey' attribute" 的编译时错误。
如何完成此设置?
您不能使用数据注释来做到这一点,因为 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
table 中手动删除相关记录。所以介绍那个FK前请三思。