2011-02-13 25 views
2

我正在使用EF-CodeFirst從我的Poco對象及其配置創建數據庫。 我大量使用Dataannotation(必需的,DataLength,RegularExpression,DataType)來獲取元數據到MVC,並有錯誤消息指向一個資源來本地化他們以後。如何在MVC中的EF CodeFirst Poco類和ViewModel類之間共享DataAnnotations?

對於簡單的CRUD操作,這不是問題。

但是一旦我需要ViewModel類,我就會從我的Poco對象中鬆開Dataannotations。

這2款設計如何組合而不必傷害DRY(不重複自己)原則?

感謝 安德烈亞斯

回答

2

你可以很容易地完成你所要求的。 Darin有一個非常有用的觀點,適用於較大的項目,但我認爲對於較小的項目來說,這聽起來像是過度殺傷力。這似乎也取決於您是使用DataAnnotations進行驗證還是使用第三方庫。涉及不這樣做的repitition會造成相當維護滋擾,恕我直言。還有一個事實是,你花了大量的代碼行將數據從數據庫複製到視圖模型; ORMs應該有助於消除這種情況,但到目前爲止,解決方案看起來並不太好。

下面是如何做你想做的代碼片段的例子。第一類是局部的,主體在EF生成的代碼中(我先模型化,而不是代碼優先)。另外,作爲一個例子,Question對QuestionGroup有一個FK。在數據庫中,這是一個名爲GroupID的列,但在ViewModel中有一個名爲GroupName的屬性,用於在一個漂亮的小網格中顯示(實際上Telerik Grid,如果您嘗試傳入EF對象,基本上會中斷)。

[MetadataType(typeof(QuestionMetadata))] 
public partial class Question 
{ 
} 

public class QuestionMetadata 
{ 
    public Int32 ID { get; set; } 

    [Required] 
    [Display(Name="Question")] 
    public String QuestionText { get; set; } 

    [Display(Name = "Order")] 
    public Int16 SortOrder { get; set; } 
} 

[MetadataType(typeof(QuestionMetadata))] 
public class QuestionViewModel 
{ 
    /* Fields found in the original model */ 

    public Int32 ID { get; set; } 

    public String QuestionText { get; set; } 

    public Int16 SortOrder { get; set; } 

    /* Fields that map child object data for this view model */ 

    [Display(Name = "Question Group")] 
    public String GroupName { get; set; } 
} 

恕我直言EF和Telerik的都被逼着我不是很乾在這裏,但沒有什麼我可以做的。 EF應該默認生成這些DataAnnotations(或者至少有選項),因爲它顯然知道哪些字段是必需的(非空)或各種字符串的最大長度。然後Telerik迫使我創建ViewModel,這也很痛苦。

+0

非常感謝您的回答。 我確實知道MetadataType屬性,但完全忘了我也可以在這裏使用它。 – nttakr 2011-05-05 06:56:54

4

這兩個設計能夠也不應該被合併。您的視圖模型與視圖相關聯,因此我個人重新定義了視圖模型中的所有必要屬性,並且相信與否,在這種情況下,我不在乎DRY。我這樣做是因爲我的觀點的要求經常變化(是的,客戶是反覆無常的),而我總是重複使用相同的領域模型。對我而言,視圖永遠不應該知道域模型的存在。視圖應該是虛擬的,它應該知道的所有內容都是由控制器傳遞給它的視圖模型。

我知道有些人可能會認爲不同,我尊重他們的意見。所以通過這樣說,我只是暴露了我的個人觀點和我使用ASP.NET MVC的方式。對於你來說,我的模型是沒有任何DataAnnotations的POCO對象,所以我不會遇到這樣的問題。我在我的視圖模型上僅使用DataAnnotations進行格式設置(例如DataType,DisplayNameDisplayFormat),並且沒有驗證屬性。爲此我使用FluentValidation.NET

+0

嗨達林!非常感謝你表達你的意見。畢竟,聽到其他人選擇設計的想法總是有好處的。我必須承認你關於分割格式和數據模型的觀點是非常有用的一點。我想我首先使用了EF代碼,並開始註解。我肯定會看看FluentValidation.NET。感謝您的發佈。 – nttakr 2011-02-13 22:02:41