首先通过代码与多个1对1关联的问题?

时间:2013-03-03 17:49:04

标签: c# sql code-first

我使用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个表AccountHolderPersonalDetails,并且共享主键方法正常工作。但现在问题发生在我添加Nominee表时,该表与PersonalDetails的关系也是1对1。在我运行代码首次迁移 Update-Database命令而不是发生异常时添加新表Nominee之后:

  

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

有人可以告诉我这个问题是什么,我该如何解决这个问题?

修改:

我在这里分享我对此问题的研究,如果我错了,请纠正我。可能会发生此异常,因为在共享主键方法中,依赖表的PK也是主表的FK。因此,在这种情况下,对于1个从属表,即AccountHolder,有2个主表,即NomineePersonalDetail。因此,当Entity框架尝试创建2个与上述异常相同名称的FK时,结果将是。

1 个答案:

答案 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违规。