编辑1:所以我没有得到任何地方并尝试了一些不同的东西。我将我的 FriendRequest 类重命名为 FriendRequestBase 并将其抽象化,然后我创建了一个 FriendRequest 类,它继承自 FriendRequestBase 而没有任何额外的字段,所以现在继承如下所示: FriendRequest : FriendRequestBase GroupModRequest : FriendRequestBase
那应该有效,对吧?现在好了,我添加了一个迁移,看看它是否会添加任何更改,是的,由于某种原因,它现在开始删除外键。
DropForeignKey("dbo.GroupModRequests", "SenderID", "dbo.AspNetUsers");
DropForeignKey("dbo.GroupModRequests", "ReceiverID", "dbo.AspNetUsers");
那里可能有什么问题?我已经使用 Fluent API 正确设置了外键:
modelBuilder.Entity<GroupModRequest>()
.HasRequired(r => r.Receiver)
.WithMany()
.HasForeignKey(k => k.ReceiverID)
.WillCascadeOnDelete(false);
modelBuilder.Entity<GroupModRequest>()
.HasRequired(r => r.Sender)
.WithMany()
.HasForeignKey(k => k.SenderID)
.WillCascadeOnDelete(false);
modelBuilder.Entity<GroupModRequest>()
.HasRequired(r => r.Group)
.WithMany(g => g.GroupModRequests)
.HasForeignKey(k => k.GroupID)
.WillCascadeOnDelete(true);
我试图在运行“更新数据库”后为我的数据库播种,这就是我得到的:
EntitySet 'ApplicationDbContext.FriendRequests' 中的所有对象都必须具有唯一的主键。但是,“AW.Models.GroupModRequest”类型的实例和“AW.Models.FriendRequest”类型的实例都具有相同的主键值,“EntitySet=FriendRequests;SenderID=a9540bd6-8532-4c7a-9f68-19d2aeecffcb;接收方 ID=8f50eccf-8ccf-432e-a033-82d933b5e3f5'。
正如我之前提到的,FriendRequests 在一个表中,而 GroupModRequests 在另一个表中,所以这个错误没有意义。不过,我可以猜到为什么会发生这种情况。
GroupModRequests 继承自 FriendRequests,我使用的是 Table-Per-Conrete-Class 方法,这意味着 FriendRequests 有一个表,GroupModRequests 有一个表,并且它具有 FriendRequests 的所有属性以及更多属性。请注意,FriendRequests 不是抽象类。
FriendRequests有一个复合主键,包括:SenderID、ReceiverID。 GroupModRequests有一个复合主键,包括:SenderID、ReceiverID 和 GroupID。
所以我敢打赌,由于某种原因,它忽略了密钥的“GroupID”部分,并忽略了它们位于不同表中的事实,并在 FriendRequest 具有与 GroupModRequest 相同的发送者/接收者 ID 时引发此错误。
那么如何在 EF6 中解决此问题?我已经用流利的方式设置了这个,但显然这还不够:
modelBuilder.Entity<GroupModRequest>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("GroupModRequests");
});
复合键如下所示:
public class FriendRequest
{
[Key, Column(Order = 1)]
public string SenderID { get; set; }
[ForeignKey("SenderID")]
public virtual ApplicationUser Sender { get; set; }
[Key, Column(Order = 2)]
public string ReceiverID { get; set; }
[ForeignKey("ReceiverID")]
public virtual ApplicationUser Receiver { get; set; }
}
public class GroupModRequest : FriendRequest
{
[Key, Column(Order = 3)]
public Guid GroupID { get; set; }
public virtual Group Group { get; set; }
}
注意:我也有“LocationModRequests”,它也继承自 FriendRequests,并且与 GroupModRequests 几乎相同,如果重要的话。