2013-04-05 161 views
4

我有一個關於如何使用Code First fluent API配置與一個連接表的一對多關係的問題。我有一個公司,聯繫對象都是共用一個地址對象像下面使用EF代碼優先加入表與一對多關係

Class Address { 
     public int AddressId 
     ..... 
    } 

Class Company { 
    public int CompanyId 
    ...... 
    public virtual ICollection<Address> Address 
} 

Class Contact { 
    public int ContactID 
    ....... 
    public virtual ICollection<Address> Address 
} 

我預計DB結構將是

Company Table 
    CompanyId PK NOT NULL 
    ..... 

Contact Table 
    ContactId PK NOT NULL 
    ..... 

Address Table 
    AddressId PK NOT NULL 
    ..... 

CompanyAddress Table 
    CompanyId NOT NULL 
    AddressId NOT NULL 

ContactAddress Table 
    ContactId NOT NULL 
    AddressId NOT NULL 

我可以通過使用下面的流暢API

實現這一目標
modelBuilder.Entity<Company>() 
    .HasMany(c => c.Address) 
    .WithMany() 
    .Map(m => 
    { 
     m => m.MapLeftKey("CompanyId") 
      .MapRightKey("AddressId") 
      .ToTable("CompanyAddress")}); 

modelBuilder.Entity<Contact>() 
    .HasMany(c => c.Address) 
    .WithMany() 
    .Map(m => 
    { 
     m => m.MapLeftKey("ContactId") 
      .MapRightKey("AddressId") 
      .ToTable("ContactAddress")}); 

但EF開始將公司和地址視爲多對多關係,當我嘗試刪除公司或聯繫人時,它不刪除相應的地址記錄(因爲EF處理他們多到很多),我如何使用帶級聯刪除選項的EF來定義這種類型的關係。我搜索了3天以上,驚訝沒有人談過或提出過這種情況,所以想知道我的方法是錯誤的還是答案很微不足道。

+1

你的問題似乎是關於級聯刪除比許多一對多的關係,等等。也許問題的標題應該更像「我如何防止EF中的級聯刪除?」 – 2013-04-05 00:53:25

回答

1

你不能與多對多(這是你創建 - 和你所描述的)。

當您刪除公司/聯繫人時,'聯接'表記錄被刪除。

可以簡化,只是這樣做在你的配置(刪除所有已):

modelBuilder.Entity<Company>() 
    .HasMany(c => c.Address) 
    .WithOptional() 
    .WillCascadeOnDelete(true); 

modelBuilder.Entity<Contact>() 
    .HasMany(c => c.Address) 
    .WithOptional() 
    .WillCascadeOnDelete(true); 
+0

但是,我如何提到連接表名和連接表的列呢? – Ashwinbaboo 2013-04-09 01:18:52

+0

我完全忘了你的帖子:)你可以做到這一點 - 但那麼你有其他問題,它是這個或那個。你想太多我想。如果你有多對多的 - 你不能按你想要的方式刪除級聯。我可以給你一個適當的手動設置多對多 - 但它再次沒用你想要的。 – NSGaga 2013-04-09 01:41:21

相關問題