2012-10-24 269 views
0

首先說,這是我第一次使用實體框架的經驗,所以我很抱歉,如果這最終是一個新手問題。到目前爲止,一切進展順利;但是,我遇到了一種情況,我不確定最好的處理方式是什麼。實體框架中的多對多關係與關係信息

我需要創建一個多對多的關係;但是,多對多表不僅包含組合鍵。在這種情況下,實體框架並不認爲它是一個多對多的結構,所以我似乎沒有簡單的能力來獲取不使用中間表的集合。有一個更好的方法嗎?

簡單的例子:

  • 一個單位可以有許多董事會和董事會可能已經在許多單位
  • 當它處於我們要記錄它是在哪一個插槽單位

表:

Unit 
UnitID(PK) 
UnitName 

Board 
BoardID(PK) 
BoardName 

UnitBoard 
UnitID(PK,FK1) 
BoardID(PK,FK2) 
Slot 

當我拉進這個使用ADO.NET實體數據國防部我的代碼el,我沒有看到一種簡單的方法從單位實體獲得與單位相關的董事會的收集,反之亦然。

有沒有更好的方法來做到這一點,或者我只是需要使用相關的UnitBoards集合,然後使用它來建立單位/董事會的集合?

這似乎我可能不是第一個去做這樣的事情的人。例如:我在考慮希望保留相關BookOwner信息(例如購買日期)的圖書和所有者。

回答

1

即使在更新的實體框架5中,這個問題也沒有好的解決方案。如果您有適當的外鍵關係,你應該能夠訪問您的主板或單位,比如:

Unit.UnitBoards.Boards 

Board.UnitBoards.Units 

,但你不會有直接的導航性能(許多-TO-許多導航)如果多對多表具有複合鍵之外的屬性。

過濾時,可以使用IncludeSelect來包含它們,以減少數據庫調用。

var myBoards = From Context.Boards 
    .Include(i => i.UnitBoards) 
    .Include(i => i.UnitBoards.Select(is => is.Unit)) 
    .Where(...) 
1

有沒有更好的辦法做到這一點還是我只需要使用UnitBoards的 關聯集合,然後用它來建立 採集單元/板的?

自定義聯結表的唯一方法就是按照以前的方式創建實體。您可以讓EF爲您管理多對多關係,以便您可以擁有直接導航集合,也可以在關係中擁有自定義屬性,但不能同時擁有這兩種關係。

如果你考慮一下爲什麼 - 如果EF確實允許你擁有關係的自定義屬性,你將如何訪問它?要從Unit獲得Board,您只需要去Unit.Boards。要從Board轉到Unit,那將是Board.Units。沒有任何地方可以爲任何個人關係設置插槽屬性。

+0

很好的解釋爲什麼! –