2011-03-18 153 views
19

這裏是我的模型:實體框架代碼優先:如何創建兩個表之間的一對多和一對一關係?

public class Customer 
{ 
    public int ID { get; set; } 

    public int MailingAddressID { get; set; } 
    public virtual Address MailingAddress { get; set; } 

    public virtual ICollection<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int ID { get; set; } 

    public int CustomerID { get; set; } 
    public virtual Customer Customer { get; set; } 
} 

顧客可以有任意數量的地址,但是隻有一個地址可以是一個郵寄地址。

我可以得到一對一的關係,一對多的工作很好,如果我只使用一個,但是當我嘗試並引入我在地址表上得到多個CustomerID鍵(CustomerID1,CustomerID2,CustomerID3)。我真的把頭髮撕掉了。

爲了映射我使用我知道你在想弄清楚這樣的實體框架的方式在這裏描述的方法http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associations.aspx

回答

18

我這個奮鬥了幾乎整整一天,當然我只是等待,最後纔在這裏提出想出來的!

除了在該博客中展示的One to One的實現之外,我還需要使用流利的api來指定多對多,因爲僅存在這種約定並不足以滿足一對一關係。

modelBuilder.Entity<Customer>().HasRequired(x => x.PrimaryMailingAddress) 
    .WithMany() 
    .HasForeignKey(x => x.PrimaryMailingAddressID) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<Address>() 
    .HasRequired(x => x.Customer) 
    .WithMany(x => x.Addresses) 
    .HasForeignKey(x => x.CustomerID); 

這裏是在數據庫中的最終模型: enter image description here

2

的一對一的關係,但如果我在設計這個我會建議不要將MailingAddress連接到數據庫。只是讓計算特性如下:

public MailingAddress { 
    get { 
     return Addresses.Where(a => a.IsPrimaryMailing).FirstOrDefault(); 
    } 
} 
+2

然而,這產生具有維護,只有一個'Address'有問題'IsPrimaryMailing = TRUE;它可以很容易出問題。 – georgiosd 2012-05-14 13:13:57

相關問題