2011-05-06 60 views
7

有沒有什麼辦法可以讓我們在底層的「多對多表」中加入實體框架中的兩個實體。如何從Enity Framework中的元模型獲得Entity到Table Mapping的多對多關係

例如,如果我們有產品和訂單實體,我們如何獲得加入產品和訂單表的底層合併表Product_Order。

任何幫助,將不勝感激。

+0

爲什麼你需要這樣做嗎?它會使與對象的交互更爲複雜。默認情況下,EF通過正確的多對多關係來隱藏這些純聯結表。 – 2011-05-06 11:15:22

+0

@Ladislav:感謝您的快速回復。實際上,我必須做一些業務邏輯多到很多桌子,而我也是這樣做的verriding ObjectContext.Is的公共詮釋SaveChanges(SaveOptions選項)方法有什麼辦法可以得到這個表名,就像我們得到一個使用ToTraceString()方法的實體的表名。看到這個:http://stackoverflow.com/questions/1895455/ – Baig 2011-05-06 12:22:05

+0

純聯結表不是一個商業實體,而只是一種表達SQL中的「多對多」關係(這就是爲什麼EF隱藏它) 。因此,「在這張桌子上做業務邏輯」沒有意義。也許你可以更詳細地描述你的情況,並且可以有更好的解決方案來解決你的問題。 – Yakimych 2011-05-06 16:04:13

回答

9

是可能的暴露結表作爲一個實體,但它不是普通/需要:

  • 您就會開始與此:

enter image description here

  • 刪除多對一您的ProductOrder實體之間的多對多關係
  • Crea在設計器中新建ProductOrder實體(通過使用工具箱或上下文菜單)
  • 在您的新實體中定義與您的聯結表中定義的外鍵相對應的兩個屬性 - ProductId,OrderId - 確保兩者都標記爲實體鍵必須在數據庫複合主鍵)並具有相同類型的PK
  • 開射的細節和你的新的實體映射到結表

enter image description here

  • 創建兩個新的一對多關聯。在ProductProductOrder之間的第一個和在OrderProductOrder之間的第二個。
  • 在每個加關係的屬性窗口中設置參照約束(as described also here)

enter image description here

有非常大的機會,如果你需要這個,你正在做的事情是錯誤的。

+2

很棒的回答。作爲一個旁註:一個快速但更骯髒的解決方案將是在聯結表中添加一些「虛擬」列(例如'Id'作爲標識)。在這種情況下,EF會將其公開爲實體。 – Yakimych 2011-05-07 15:24:22

+0

感謝您的及時幫助。 – Baig 2011-05-10 06:38:29

+0

@拉迪斯拉夫,不知道你爲什麼會這麼說,「如果你需要這樣做,你就會犯錯誤。」因爲無論什麼時候需要爲關係添加屬性,這都是非常常見的現象。例如,您可以在家庭和人員之間創建多對多關係,但您需要這樣做才能添加購買日期或屬於關係的其他任何內容,而不是主要實體。 – spadelives 2015-10-26 05:37:04

相關問題