2011-03-17 83 views
3

這或多或少是一個普遍的問題,而不是特定的任何特定ORM或語言:無論您的ORM首選項如何,此問題都會出現。ORM和多對多關係

當映射多對多關係時,可能會隱藏中間表或使中間表成爲模型的一部分。在中間表具有超出關係的有價值數據的情況下,您如何處理映射?

考慮以下表:

CaseWorker (id, first_name, last_name) 
CaseWorkerCases (case_worker_id, case_id, date_opened, date_closed) 
Case (id, client_id, field_a, field_b) 

作爲一個程序員,我真的寧願能夠做到:

CaseWorker.Cases 

CaseWorker.CaseWorkerCases.Cases 

,一方面,表CaseWorkerCases包含有用的數據並隱藏中間表使訪問該數據不太方便NT。另一方面,不得不通過中間表進行導航,這使得訪問案例的共同任務看起來很尷尬。

我提出一個解決方案可能是暴露模型中的中間表,然後給CaseWork對象一個包裝屬性可以工作。例如:

public IEnumerable<Case> Cases 
{ 
    get{return (from caseWorkerCase in this.CaseWorkerCases 
       select caseWorkerCase.Case);} 
} 

但這也似乎是錯誤的。

+0

我使用的是DDD。其中大部分隱藏在服務層後面。我曾在一個隱藏中間表的項目上工作。當Linq查詢需要來自中間表的數據,並且需要將數據提交給主講者/視圖(例如顯示所有打開的案例,案例工作者以及案例被打開的日期的GridView)時,這會導致問題。對於這個項目,我採取了兩層方法,但我不是它產生的「醜陋」代碼的粉絲。 – mlindegarde 2011-03-17 19:40:04

回答

1

我認爲多對多映射只是與中間表的兩個一對多映射的符號縮寫,就像您所說的那樣,從而可以簡化關係。它只適用於關係沒有屬性的地方。然而,隨着對特定領域的理解的提高,我通常會發現多對多映射通常需要細分以允許附加屬性。所以我現在常用的方法是總是簡單地使用一對多映射來開始。