你可以很容易地完成你所要求的。 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,這也很痛苦。
非常感謝您的回答。 我確實知道MetadataType屬性,但完全忘了我也可以在這裏使用它。 – nttakr 2011-05-05 06:56:54