ASP.NET MVC Entity Framework:数据注释
ASP.NET MVC Entity Framework: Data Annotations
我正在使用 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 案例中,我可以在同一个 class 中使用以下数据注释属性,即:
[Required]
public string NAME { get; set; }
[Required]
public string LAST_NAME { get; set; }
现在,让我们进入下一个案例。我需要另一个视图,我们称之为 VIEW 2
在这一个中,用户需要为所有属性指定所有值。除了名字和姓氏之外,所有这些都是必需的。
真正的问题
如何对两个视图使用相同的模型 class?上面的示例可能看起来有点愚蠢和琐碎的验证,但我参与过更大的项目,其中的实体更大,拥有不同 ViewModel classes 的想法实在是太麻烦了。
我在我的 .NET 开发中偶然发现了这一点,以至于我不得不为每个视图创建一个 ViewModel class 以便特定于用户需要输入的内容和他们的验证。这是唯一的方法吗?
如果您尝试使用 Entity Framework 实体方法,我不会在这些实体上放置验证属性。我会:
创建单独的不同 classes,然后将数据从 EF 实体复制到模型,反之亦然(通过显式编写代码,或使用 AutoMapper 等工具或许多其他)。然后您可以随意定义验证规则。不幸的是,这种方法确实将验证与模型紧密结合,因此模型重用可能不太可能。
使用更流畅的验证框架,如 FluentValidation (https://github.com/JeremySkinner/FluentValidation)。这样做的好处是,您可以使用内部规则定义外部 class,可以根据不同情况应用不同的规则。该模型可能仍然需要模型本身的一些指标来确定适用哪些规则,但这是处理您描述的场景的另一种功能方法。
为避免重复具有微小变化的模型,请尝试以下操作:
基本上,创建一个具有适用于所有情况的数据注释的基本模型(例如:DisplayName
),然后扩展模型以进行变体(例如:Required
属性)。
我正在使用 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 案例中,我可以在同一个 class 中使用以下数据注释属性,即:
[Required]
public string NAME { get; set; }
[Required]
public string LAST_NAME { get; set; }
现在,让我们进入下一个案例。我需要另一个视图,我们称之为 VIEW 2 在这一个中,用户需要为所有属性指定所有值。除了名字和姓氏之外,所有这些都是必需的。
真正的问题
如何对两个视图使用相同的模型 class?上面的示例可能看起来有点愚蠢和琐碎的验证,但我参与过更大的项目,其中的实体更大,拥有不同 ViewModel classes 的想法实在是太麻烦了。
我在我的 .NET 开发中偶然发现了这一点,以至于我不得不为每个视图创建一个 ViewModel class 以便特定于用户需要输入的内容和他们的验证。这是唯一的方法吗?
如果您尝试使用 Entity Framework 实体方法,我不会在这些实体上放置验证属性。我会:
创建单独的不同 classes,然后将数据从 EF 实体复制到模型,反之亦然(通过显式编写代码,或使用 AutoMapper 等工具或许多其他)。然后您可以随意定义验证规则。不幸的是,这种方法确实将验证与模型紧密结合,因此模型重用可能不太可能。
使用更流畅的验证框架,如 FluentValidation (https://github.com/JeremySkinner/FluentValidation)。这样做的好处是,您可以使用内部规则定义外部 class,可以根据不同情况应用不同的规则。该模型可能仍然需要模型本身的一些指标来确定适用哪些规则,但这是处理您描述的场景的另一种功能方法。
为避免重复具有微小变化的模型,请尝试以下操作:
基本上,创建一个具有适用于所有情况的数据注释的基本模型(例如:DisplayName
),然后扩展模型以进行变体(例如:Required
属性)。