0

编辑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、ReceiverIDGroupModRequests有一个复合主键,包括: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 几乎相同,如果重要的话。

4

0 回答 0