2013-03-12 68 views
1

我正在開發一個使用兩個應用程序使用的SQL數據庫的現有應用程序。一個使用實體框架連接到數據庫。另一個使用LINQ到SQL。 SQL數據庫的設計使得有些表格顯示了兩個表中的行之間的多對多關係。實體框架似乎不會導入這些表格,顯然是因爲它具有一些面向對象的想法,應該表示多對多關係。到目前爲止,Entity Framework應用程序不需要知道這些表,但現在它應該。我不知道這是如何工作的,我擔心的是,即使我瞭解實體框架的令人興奮的新方法來表示這些關係,也不會很好地與其他應用程序或旨在使用多個對多桌。如何使用Entity Framework中的SQL多對多表?

也就是說,有一張Foos表和一張酒吧表,然後是一個帶有Foo和Bar Ids的表格,列出哪些Foos與哪個酒吧有關,而且我不想停止使用這個關係表,特別是因爲還有另一個大量使用這個關係表的LINQ應用程序。

問題:

如果我學會用實體框架的許多一對多的系統,它將使用和更新許多到許多表,其他應用程序使用?

如果不是,讓Entity Framework不忽略多對多關係表的好方法是什麼,所以我可以編寫代碼來使用現有表?

+0

什麼版本的實體框架? – Justin 2013-03-12 02:17:23

+0

它是實體框架v4.0.30319。 – Dronz 2013-03-12 17:51:19

回答

4

是的,實體框架將爲您管理多對多的表格。 EF中的純鏈接表(只有兩個外鍵列)被表示爲關係,而不是POCO對象。這樣做的方式是告訴EF您的兩個對象之間存在關係,並且表X是存儲關係的位置。以EF 4.1爲例。這是我目前使用的是什麼,這是像這樣做:

modelBuilder.Entity<Foo>() //Let me tell you about Foo... 
      .HasMany(f => f.Bars) //The property in the Foo class that links to Bar objects is Bars 
      .WithMany(b => b.Foos) //The property in the Bar class that links to Foo objects is Foos 
      .Map(m => { 
       m.MapLeftKey("FooID"); //Name of the foreign key column in the link table for Foo 
       m.MapRightKey("BarID"); //Name of the foreign key column in the link table for Bar 
       m.ToTable("FooBar"); //Name of the link table 
      }); 

然後,您可以通過鏈接/在你的代碼斷開鏈接對象更改此表。你幾乎可以做類似

myFoo.Bars.Add(myBar); //Add a row to the link table 
myFoo.Bars.Remove(myBar) //Delete a row from the link table 

對於完整的實現,你應該谷歌你的EF版本。

如果鏈接表包含額外的列(例如創建日期),則它們與POCO一樣,代表所有其他表格。如果你對EF管理你的鏈接表的能力真的很偏執,你可以強制它通過添加一個唯一的id列到你的純鏈接表中,但我肯定會反對它。

想想這樣:EF已經有一段時間了,已經取得了一定的成熟度。將這與多對多關係在數據庫中並不罕見的事實結合起來。你真的認爲EF的設計師沒有處理你的案子嗎?

+0

感謝馬諾斯!現在我需要在代碼中調用modelBuilder,而不是讓VS嚮導根據數據庫自動創建一個對象模型。 (也就是說,你的代碼示例看起來不錯,但我需要弄清楚在哪裏放置,以及將來需要哪些步驟來更新數據庫,因爲過去它已經使用嚮導進行了更新。)感謝您的解釋我可以添加一列來強制POCO。 – Dronz 2013-03-12 17:57:41

+0

至於我擔心EF設計師有沒有做過什麼,在我看來,MS在我看來有一種明確的模式,用新設計製造新版本,省略了舊的做事方式,通常以一種強制的方式 - 因素或處理現在無法完成的事情(如http://stackoverflow.com/questions/4719559/fix-display-garbage-left-by-wpf-dialog-window),所以我很害怕可能無法在舊桌上表現出色,或者讓它開始工作會讓人頭疼。但是這看起來不錯。再次感謝! – Dronz 2013-03-12 18:01:31

相關問題