2016-03-04 52 views
2

我有兩個POCO實體,ApplicationUser和Account。重複的外鍵

  • 一個帳戶有許多ApplicationUser。
  • 每個帳戶只能有一個ApplicationUser誰是BillingContact

所以,我的實體有:

public class ApplicationUser 
{ 
    public string Id { get; set; } 

    public int AccountId { get; set; } 
    public virtual Account Account { get; set; } 
} 

public class Account 
{ 
    public int Id { get; set; } 

    [ForeignKey("BillingContact")] 
    public string BillingContactId { get; set; } 
    public virtual ApplicationUser BillingContact { get; set; } 

    public virtual ICollection<ApplicationUser> Users { get; set; } 

我的問題是,當我創建一個遷移,代碼最初只有部分的理解是BillingContact是一個外鍵。遷移代碼使用BillingContactId外鍵創建帳戶表,但它也會創建額外的Account_Id外鍵字段。

我發現了一個解決方法,但它嚴肅地不通過「氣味」測試。根本問題是我有兩個類之間的多個關係,這使得代碼優先。特別是,ApplicationUser實體沒有導航屬性,它是BillingContact外鍵的「另一端」。

如果我的導航屬性添加到ApplicationUser,並與InverseProperty屬性,那麼代碼優先似乎明白了外鍵,並且不產生額外字段將其標記:

public class ApplicationUser 
{ 
    public string Id { get; set; } 

    public int AccountId { get; set; } 
    public virtual Account Account { get; set; } 

    [InverseProperty("BillingContact")] 
    public virtual ICollection<Account> MyBillingAccounts { get; set; } 
} 

與此問題解決方法是MyBillingAccounts導航屬性完全是假的。一個賬戶有一個相關的ApplicationUser,它是賬單聯繫人,但是反向關係(從ApplicationUser導航回到BillingContactId外鍵)沒有任何實際意義。

因此... 有沒有更好(或適當)的方式來教授關於BillingContactId外鍵的代碼優先?

回答

3

你只能用流暢的映射來做到這一點。例如,在你的背景下OnModelCreating的覆蓋:

modelBuilder.Entity<Account>() 
      .HasOptional(acc => acc.BillingContact) 
      .WithMany() 
      .HasForeignKey(acc => acc.BillingContactId); 

WithMany()電話表示有沒有導航屬性關聯的反向端。

+0

感謝您的即時答覆!實際上,我想我需要'HasRequired()'而不是'HasOptional()',因爲我想要FK是必需的(不可爲空)。但是這一細節在OP中並不清楚。 –