2013-03-03 36 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

相關問題