2010-10-16 72 views
2

如果我公開我的EF 4模型對象(EF4實體)作爲屬性在我的ViewModel我「打破」MVVM?作爲MVVM數據綁定的ViewModel的屬性公開實體框架實體

我是否必須將每個Model類複製爲某種DTO並從ViewModel中公開這些DTO?

我理解View對模型的「不知道」的理論價值,但事實是(如果我不通過ViewModel將Model暴露給View),我必須有一些類它們具有與要綁定到的Model類相同的屬性。然後,在ViewModel中,我不得不刮掉那些DTO-ish對象的屬性來更新適當的EF實體(模型)。

這似乎是很多額外的代碼來編寫和維護。如果我在我的ViewModel上公開實體屬性(並綁定到該屬性),我仍然可以使用通過綁定ViewModel屬性設置ViewModel中的代碼/邏輯和啓用/禁用狀態的命令(即保存或刪除)。

如果您想知道:「必須爲您的ViewModel編寫一個或兩個DTO,有什麼大不了的?」你在想太小。

我有一個應用程序與75 + SQL表(因此75 + EF4實體)。我不喜歡編寫和維護75多個DTO的想法。現在我可以使用T4爲我的所有實體生成DTO,甚至可以生成部分類,以便我可以「自定義」這些生成的DTO,而不必丟失自定義項,如果必須重新生成。 儘管如此,我還是覺得這樣做是「值得的」,而且我還不確定。

想法?

+1

對不起,但考慮重新措辭你的問題。最後三段基本上是一個咆哮。注意這一點,重點關注您的實際問題/疑慮 - 將有助於提供準確的答案。 – RPM1984 2010-10-16 07:39:14

+1

我特別喜歡最後三段提出我的答案。它包含重要的信息。 – JanW 2010-10-16 07:56:42

回答

1

我們在模型中也遇到了大約200個實體的問題。由於數據綁定直接回寫到模型中,因此ViewModel事實上不再控制對db實體的這些更改。目前,我們已經找出了一個解決方案,我們將在下一個重構週期中實施解決方案。我們還使用T4模板來改進一些EF功能缺乏。所以我們的想法是有一個ViewEntity和一個DbEntity。爲此,您不必創建/生成另一個DTO類。如果你實例化一個新的實體,而不把它添加到ObjectContext中,它的行爲就像一個簡單的DTO。

所以我們的解決方案將是:

  • 下載和DB實體結合上下文(我們正在使用CLR存儲過程和T4產生Materializers)

  • 爲每創建一個新的視圖實體實體,它將暴露給視圖,使用T4生成的Clone()方法,該方法返回未綁定版本的db實體。

現在,您已完全控制回寫更改或取消viewmodel中的更改,因爲數據綁定到視圖實體不會影響db實體。

+0

你能解釋一下T4生成的克隆方法嗎? – 2010-10-17 07:33:40

+0

必須分析每個實體的模型信息,提取有關所有基本屬性的信息,但不能在Clone方法中重現的主鍵除外。然後,您需要創建新實體並從給定的DB實體複製其所有基本屬性。簽名將如下所示:public static TEntity Clone(TEntity dbEntity); TEntity是當前實體的全稱。如果你需要代碼示例再問一次 – JanW 2010-10-19 07:12:08