2011-08-03 100 views
0

我有幾個表的關係是基於唯一的關鍵約束。EF加入和MVC剃刀視圖

一個簡單的例子是:

VERSIONID,版本名稱
SurveyId,SurveyName,VERSIONID
QuestionId,QuestionName,SurveyId,VERSIONID

EF目前不支持基於獨特的鍵約束的關係。在我的問題的索引視圖中,對於模型來說,處理連接以調查問題的最佳方式是使用調查名稱來顯示問題的網格?

我需要匿名類型嗎? db.Questions.Include(「調查」)似乎沒有做任何事情。我可以使用linq並創建連接表的ViewModel(我懷疑這是要走的路),但EF & MVC中有太多東西,我認爲在做任何事之前我會檢查它們。

回答

1

爲什麼在調查表和問題表中都有指向版本(即VersionID)的鏈接?你不能通過調查來得到問題的版本嗎?

此外,如果問題與調查之間的關係是多對一或一對一(每個問題只有一項調查),那麼它應該是db.Questions.Include("Survey")-非複數

+0

「爲什麼是版本問題」的簡單答案是,還有其他表格依賴於與問題鏈接的版本。爲了確保這種說法,答案是問題的適當版本,我需要問題表本身的版本。 –

+0

當對任何東西使用「包含」時,我沒有獲得所得到的實體的其他屬性......我懷疑這是因爲實體框架沒有意識到唯一的鍵約束,所以它會根據它們跳過/忽略外鍵。 –

+0

我有複合鍵來確保數據庫本身的參照約束。你的問題使我成立了一個只有相關數據的EF協會。它就像一個冠軍!然後我不得不刷新自己的模式,我想......冗餘關係不會在數據庫中造成傷害,所以我添加了一堆加入只有一個鍵而不是複合鍵和BAM的關係,所有內容都被鏈接起來與EF的善良。感謝您的靈感:-) –

1

首先,剃鬚刀視圖中沒有連接(或幾乎任何其他邏輯)。控制器是構建ViewModel的地方,而視圖只是呈現該ViewModel的手段。正如你所提到的,製作ViewModel只是(正確)的路要走。你可以用任何方法填充視圖模型 - linq是創建連接數據的絕對正常方式。如果你想更進一步,你應該把這個連接邏輯放在某種存儲庫中,例如QuestionRepository,而不是控制器。

+0

啊問題存儲庫不是一個控制器,我喜歡這樣:-)我一直在盡我所能,以保持與其相關控制器中的實體有關的所有邏輯... –