2

我正在使用 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并且共享主键方法在它上面运行良好。但是现在当我添加与Nominee1 对 1 关系的表时,就会出现问题PersonalDetails。添加新表后Nominee,当我运行代码第一次迁移的Update-Database 命令时,出现异常:

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

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

编辑 :

我在这里分享我对这个问题的研究,如果我错了,请纠正我。可能会发生此异常,因为在共享主键方法中,依赖表的 PK 也是主表的 FK。因此,在这种情况下,有 2 个主表 ieAccountHolderNominee1 个从属表 ie PersonalDetail。因此,当实体框架尝试创建 2 个同名的 FK 时,就会出现上述异常。

4

1 回答 1

1

我想扩展我的评论。

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

假设您的 AccountHolder 表有以下记录

Id
----
1
2
3

您的 Nominee 表有以下记录

Id
----
3
4
5

假设您想将一条记录插入到 PersonalDetail 中DetailId = 3。这是否与 Nominee 3 或 AccountHolder 3 匹配?

此外,如果您尝试使用 插入 PersonalDetail DetailId = 2,您将收到 FK 违规,因为没有 Nominee 2。如果您想插入DetailId = 4,同样适用,没有 AccountHolder 4,因此您将收到 FK 违规。

于 2013-03-04T14:21:21.240 回答