9

使用數據庫第一個模型:假設我們有經典表Student,CourseStudentCourse(後者明顯具有FK到StudentCourse)。如果沒有交集對象,Can Entity Framework可以處理多對多關係嗎?

如果您將此模型導入EF,您將獲得爲它們中的每一個生成的對象。 StudentCourse類將分別具有StudentCourses的集合,從中您需要跳轉到另一個關係,分別轉到CourseStudent

我想有以這樣的方式,底層交集表是不可見的生成的代碼,即Student具有Courses的集合,並且Course具有Students集合。我已經在其他ORM軟件(特別是,TopLink)中看到了這一點。可以在EF中完成嗎?

+0

那麼,只要免除'table1table2'模型? –

+0

這對於代碼優先來說當然是可行的,所以我會認爲它可以用數據庫優先。 –

+1

你的'StudentCourses'表中是否有其他列?這篇文章似乎建議你會得到所需的行爲,如果它不:http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/ –

回答

9

根據this tutorial,如果您的StudentCourse表只包含外鍵列,您將會得到所需的行爲。如果它包含任何其他列,EF將生成一箇中間實體來表示聯接。

在這種情況下,從StudentCourse表中刪除代理鍵並將其替換爲複合主鍵應該有效。

+0

救世主答案... – Javier

+2

基本上,只要你有一個關於關係的額外「屬性」,你就會在EF中得到額外的實體。您只需將代理鍵作爲「屬性」即可。硬幣的另一面是,如果你想要屬性,這個額外的實體是必須擁有的。 (將員工視爲JobTitle關係,但〜關係具有「StartedOnDate」屬性,因此您必須擁有此額外實體。 – granadaCoder

-3

您可以使用ICollections在EF Code First中執行此操作。例如:

public class Student 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Course> Courses { get; set; } 

    public Student() 
    { 
     Courses = New HashSet<Course>(); 
    } 
} 

重複課程並將其全部交換。這將在您的數據庫(學生,課程和學生課程)中創建三個具有m-m關係的表格。最重要的是,StudentCourse將是一個隱形鏈接表,在你的模型中沒有實體。

+0

網絡上有很多關於它的問題。我發現的最有用的文章是[Prashant Brall]的這篇文章(http://prashantbrall.wordpress.com/2011/03/23/ef-code-first-managing-relationships/)。 – markp3rry

+0

正確,只要〜關係沒有任何額外的屬性。看到我對理查德回答的評論。 – granadaCoder

相關問題