2012-01-19 45 views
23

我想在EF代碼中建立多對多的關係,但默認約定是錯誤的。以下類別描述了這種關係:如何使用實體框架流暢的API配置多對多的關係

class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class Account 
{   
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

一個帳戶可以有許多產品。

然而,EF約定將創建數據庫表爲:

Products Table 
-------------- 
Id 
Name 
Account_Id <- What is this? 

Accounts Table 
-------------- 
Id 
Name 

這看起來並不像一個多到多表結構?我如何配置流暢API以反映關係並創建中間表:

AccountProducts Table 
--------------------- 
Account_Id 
Product_Id 
+1

是不是要一個多對多的? –

+0

謝謝 - 編輯標題以反映正確的含義 – Fixer

+1

格式良好的問題。容易明白。 –

回答

53
modelBuilder.Entity<Account>() 
      .HasMany(a => a.Products) 
      .WithMany() 
      .Map(x => 
      { 
       x.MapLeftKey("Account_Id"); 
       x.MapRightKey("Product_Id"); 
       x.ToTable("AccountProducts"); 
      }); 
+0

感謝您 - 將此標記爲公認的答案,因爲這樣我可以設置單向關聯而無需在產品類中添加(不需要的)關聯 – Fixer

+0

如果我想關注關聯表上的其他數據,像date_added,關係類型等。我可以爲AccountProducts定義一個POCO嗎?在這種情況下你如何做映射? – hazimdikenli

+0

@hazimdikenli:那麼你不能使用多對多的關係。你必須用兩個一對多的關係來建模。詳細信息在這裏:http://stackoverflow.com/questions/7050404/create-code-first-many-to-many-with-additional-fields-in-association-table/7053393#7053393 – Slauma

6

EF建議的是一對多關係。

一個賬戶可以有很多產品,即每個產品都有一個ACCOUNT_ID

如果你想有一個多對多的關係(以及創建一箇中介表),下面應該工作

class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Account> Accounts { get; set; } 
} 

class Account 
{   
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 
+0

哦,這很容易 - 但爲什麼我們需要在這裏雙向關聯?在域模型中,我們不想通過每個產品訪問帳戶。 – Fixer

+0

如果產品不知道它連接到哪個帳戶,則無法定義關係。 例如,如果您使用viewModels,您可以始終排除accountId並只映射您需要的數據 – NinjaNye

+0

您知道任何隱藏(訪問修飾符?)雙向關聯的方法嗎? – Fixer

1

守則第一以正確的關係方式創建表格。當

一個帳戶可以有許多產品。

產品表應該爲其帳戶存儲密鑰,就像它現在實際上一樣。

你想在db中看到的是多對多的關係,而不是一對多。如果你想達到與代碼首先,你應該重新設計你的實體

class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Account> Accounts { get; set; } 
} 

class Account 
{   
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

在這種情況下,一個產品可以有多個帳戶,一個帳戶可以有很多產品。

1
 public AccountProductsMap() 
    { 
     this.ToTable("AccountProducts"); 
     this.HasKey(cr => cr.Id); 

     this.HasMany(cr => cr.Account) 
      .WithMany(c => c.Products) 
      .Map(m => m.ToTable("AccountProducts_Mapping")); 
    } 
相關問題