我使用Code First方法创建数据库。在这里,我尝试使用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
,并且共享主键方法正常工作。但现在问题发生在我添加Nominee
表时,该表与PersonalDetails
的关系也是1对1。在我运行代码首次迁移的 Update-Database命令而不是发生异常时添加新表Nominee
之后:
操作失败,因为表'PersonalDetails'上已存在名称为“IX_PersonalDetailId”的索引或统计信息
有人可以告诉我这个问题是什么,我该如何解决这个问题?
修改:
我在这里分享我对此问题的研究,如果我错了,请纠正我。可能会发生此异常,因为在共享主键方法中,依赖表的PK也是主表的FK。因此,在这种情况下,对于1个从属表,即AccountHolder
,有2个主表,即Nominee
和PersonalDetail
。因此,当Entity框架尝试创建2个与上述异常相同名称的FK时,结果将是。
答案 0 :(得分:1)
我想扩展我的评论。
即使您解决了命名问题,也不能让一列成为两个表的外键。
假设您的AccountHolder表包含以下记录
Id
----
1
2
3
你的Nominee表有以下记录
Id
----
3
4
5
假设您要使用DetailId = 3
将记录插入PersonalDetail。这与Nominee 3或AccountHolder 3相匹配吗?
此外,如果您尝试使用DetailId = 2
插入PersonalDetail,您将获得FK违规,因为没有被提名者2.如果您要插入DetailId = 4
,则没有AccountHolder 4 ,所以你会受到FK违规。