首先通过代码进行多个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个表AccountHolder
和PersonalDetails
,共享主键方法在它上工作得很好。但是现在,当我添加与PersonalDetails
也有1对1关系的Nominee
表时,出现了问题。添加新表Nominee
后,当我运行Update-Database命令代码的第一次迁移比异常发生:
操作失败,因为在表'PersonalDetails'上已经存在名称为'IX_PersonalDetailId'的索引或统计信息
谁能告诉我问题是什么,我该如何解决这个问题?
我在这里分享我对这个问题的研究,如果我错了,请纠正我。出现这种异常可能是因为在共享主键方法中,从属表的PK也是主表的FK。所以在这种情况下,有两个主表,即AccountHolder
和Nominee
,一个从属表,即PersonalDetail
。因此,当实体框架尝试创建2个相同名称的fk比上述的异常将是结果。
我想详细说明一下我的评论。
即使解决了命名问题,也不能让一个列成为两个表的外键。
假设您的AccountHolder表有以下记录
Id
----
1
2
3
您的提名人表有以下记录
Id
----
3
4
5
假设您想用DetailId = 3
将一条记录插入PersonalDetail。与被提名人3或账户持有人3匹配吗?
此外,如果您尝试使用DetailId = 2
插入PersonalDetail,您将获得FK违规,因为没有提名人2。如果您想插入DetailId = 4
,也同样适用,因为没有accounholder 4,所以您将得到FK冲突。