2013-03-03 110 views
2

我使用Code First方法创建数据库。在这里,我想实现1对1的关系用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的关系。添加新表Nominee当我运行Update-Database命令的代码首先迁移比异常后occure:

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

任何人都可以请告诉我最新的问题,我该如何解决这个问题?

编辑:

我在这里分享我的研究,在这个问题上,请纠正我,如果我错了。可能会发生此异常,因为在共享主键方法中,依赖表的PK也是主表的FK。因此,在这种情况下,有2个主表,即AccountHolderNominee用于1个依赖表,即PersonalDetail。所以当Entity框架尝试创建2个与上面提到的异常相同的FK时,结果就是这样。

+1

您必须使用具有'PersonalDetail'属性的基类('AccountHolder'和'Nominee'派生自它)。我认为这可以与TPH继承一起使用。 – 2013-03-04 08:38:01

+0

你的迁移是什么样子的? – cadrell0 2013-03-04 14:02:11

+0

我刚刚阅读你的编辑,是的。PersonalDetail应该是主要表格,AccountHolder和被提名者应该是从属表格 – cadrell0 2013-03-04 14:04:45

回答

1

我想扩展我的评论。

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

比方说,您的账户持有表中有以下记录

Id 
---- 
1 
2 
3 

而且你的提名表中有以下记录

Id 
---- 
3 
4 
5 

比方说,你想记录插入PersonalDetail与DetailId = 3。这是否与提名人3或账户保管人3相符?

此外,如果您尝试使用DetailId = 2插入PersonalDetail,你会得到FK违反因为没有提名2.如果要插入DetailId = 4同样适用,没有户口持有4,所以你会得到一个FK违反。

+0

感谢您的解释,现在它清楚我在这 – gaurav 2013-03-04 15:26:32

+0

请注意,只是简单地切换关系并使PersonalDetail成为主表将解决此问题。 – cadrell0 2013-03-04 15:45:20

+0

如果我正确理解你的评论,而不是'委托人可以永远存在而不依赖',所以我认为只有没有其所有者(AccountHolder或Nominee)的personalDetail没有意义,不是吗? – gaurav 2013-03-04 17:03:25

相关问题