我正在使用数据库优先方法处理Entity Framework。我已经在我的应用程序中定义了模型。现在我正在使用控制器和视图。我使用脚手架来创建控制器。现在我想创建行。
假设我想创建员工,让我们说DBA和EF使这成为可能:
public partial class TBL_EMPLOYEE
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public TBL_EMPLOYEE()
{
this.TBL_EMPLOYEE = new HashSet<TBL_EMPLOYEE>();
}
public int EMPLOYEE_ID { get; set; }
public String CO_WORKER_NUMBER { get; set; }
public string NAME { get; set; }
public string LAST_NAME { get; set; }
public string SALARY { get; set; }
public string PHONE_NUMBER { get; set; }
public string EMAIL { get; set; }
public string { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
}
现在,我需要一个创建员工的视图,让我们称之为 VIEW 1 在此视图中,用户只需指定名称和姓氏值。两者都是必需的。
现在,在这个 VIEW 1 的情况下,我可以在同一个类中使用以下数据注释属性,即:
[Required]
public string NAME { get; set; }
[Required]
public string LAST_NAME { get; set; }
现在,让我们进入下一个案例。我需要另一个视图,我们称之为视图2 在这一个中,用户需要指定所有属性的所有值。除名称和姓氏外,所有这些都是必需的。
真实问题
如何为两个视图使用相同的模型类?上面的示例可能看起来有点愚蠢和微不足道的验证,但我一直在更大的项目中实体更大,并且拥有不同的ViewModel类的想法就是这么多工作。
我在.NET开发中偶然发现了这一点,我必须为每个视图创建一个ViewModel类,以便具体了解用户需要输入和验证的内容。这是唯一的方法吗?
答案 0 :(得分:1)
为避免重复出现微小变化的模型,请尝试以下操作:
https://stackoverflow.com/a/18898112/6850962
基本上,创建一个基础模型,其数据注释适用于所有情况(例如:DisplayName
),然后扩展模型以进行变化(例如:Required
属性)。
答案 1 :(得分:0)
如果您尝试使用实体框架实体方法,我不会将验证属性放在这些实体上。我要么:
创建单独的不同类,然后将数据从EF实体复制到模型,反之亦然(通过明确编写代码,或使用AutoMapper等工具)。然后,您可以根据需要定义验证规则。不幸的是,这种方法确实将验证与模型紧密结合,因此模型重用可能不尽可能。
使用更流畅的验证框架,如FluentValidation(https://github.com/JeremySkinner/FluentValidation)。这样做的好处是您可以使用内部规则定义外部类,可以根据具体情况对其进行不同的应用。该模型可能仍然需要模型本身的一些指标来确定适用的规则,但这是处理您描述的方案的另一种功能方法。