你可以很容易地完成你所要求的。Darin 有一个非常有效的观点,适用于较大的项目,但我认为对于较小的项目,这听起来有点矫枉过正。似乎这在很大程度上取决于您是使用 DataAnnotations 进行验证还是使用 3rd 方库。恕我直言,不这样做所涉及的重复将造成相当大的维护麻烦。还有一个事实是您花费大量代码行只是将数据从数据库复制到视图模型;ORM 应该有助于消除这种情况,但到目前为止,解决方案似乎并不是很好。
这是一个关于如何做你想做的事的示例代码片段。第一个类是部分的,主体在 EF 生成的代码中(我先是模型,而不是代码)。此外,作为示例,Question 对 QuestionGroup 有一个 FK。在数据库中,这是一个名为 GroupID 的列,但在 ViewModel 中有一个名为 GroupName 的属性,用于在一个漂亮的小网格中显示(实际上,Telerik 网格,如果你尝试传入一个 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,这也很痛苦。