首先通过代码进行多个1对1关联的问题

本文关键字:关联 问题 代码 | 更新日期: 2023-09-27 18:01:53

我使用代码优先方法创建数据库。在这里,我试图使用Shared primary key方法实现1对1的关系:

public partial class AccountHolder
{
    public int AccountHolderId { get; set; }
    public virtual PersonalDetail Detail { get; set; }
}
//Added later 
public partial class Nominee
{
    public int NomineeId { get; set; }
    public virtual PersonalDetail Detail { get; set; }
}
public partial class PersonalDetail
{
    public int PersonalDetailId { get; set; }
    ... 
}

我的流畅Api代码:

        modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail)
                                            .WithRequired()
                                            .WillCascadeOnDelete();
        //Added later
        modelBuilder.Entity<Nominee>().HasOptional(p => p.Detail)
                                      .WithRequired()
                                      .WillCascadeOnDelete();

最初我只有2个表AccountHolderPersonalDetails,共享主键方法在它上工作得很好。但是现在,当我添加与PersonalDetails也有1对1关系的Nominee表时,出现了问题。添加新表Nominee后,当我运行Update-Database命令代码的第一次迁移比异常发生:

操作失败,因为在表'PersonalDetails'上已经存在名称为'IX_PersonalDetailId'的索引或统计信息

谁能告诉我问题是什么,我该如何解决这个问题?

我在这里分享我对这个问题的研究,如果我错了,请纠正我。出现这种异常可能是因为在共享主键方法中,从属表的PK也是主表的FK。所以在这种情况下,有两个主表,即AccountHolderNominee,一个从属表,即PersonalDetail。因此,当实体框架尝试创建2个相同名称的fk比上述的异常将是结果。

首先通过代码进行多个1对1关联的问题

我想详细说明一下我的评论。

即使解决了命名问题,也不能让一个列成为两个表的外键。

假设您的AccountHolder表有以下记录

Id
----
1
2
3

您的提名人表有以下记录

Id
----
3
4
5

假设您想用DetailId = 3将一条记录插入PersonalDetail。与被提名人3或账户持有人3匹配吗?

此外,如果您尝试使用DetailId = 2插入PersonalDetail,您将获得FK违规,因为没有提名人2。如果您想插入DetailId = 4,也同样适用,因为没有accounholder 4,所以您将得到FK冲突。