如何避免在EF自动生成的model中的DataAnnotation被覆盖掉

Posted 小水皮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何避免在EF自动生成的model中的DataAnnotation被覆盖掉相关的知识,希望对你有一定的参考价值。

摘自ASP.NET MVC 5 网站开发之美 6.4 Metadata与数据验证

如果使用Database-First方式生成*.edms,那么所生成的类文件会在*.tt文件的层级之下,扩展名tt是一种称为T4(Text Template Transformation Toolkit)的技术,简而言之,T4是一种用程序代码生成程序代码的技术。当*.edms有所变动时(例如,执行“从数据库更新模式”)并单击存储时会重新生成T4文件,一旦T4文件被变动便会立即执行T4程序代码重新生成所有文件的内容。

以下使用范例来说明T4特性,使用“添加新建项”,选择“常规”选择“文字模板”,会得到含下列代码的*.tt模板,而且会立即生成同名称的*.txt文件。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".txt" #>

Hello T4, 現在時間 <#=  System.DateTime.Now #>

 

 在网站开发期间,如Table Schema等Model变动相当正常,可能会经常变动*.edmx的内容。如果将前面的DataAnnotations命名空间的验证属性类一一设置到*.tt层级下的类文件中,那么当*.tt文件一旦被变动,所有类文件将会被重新生成,之前设置的验证属性也会被清楚,这会造成开发上的困扰。

ASP.NET MVC部分类设置步骤如下(以Northwind的Product类为例):

namespace Ch06.Models
{
    [MetadataType(typeof(ProductMD))]
    public partial class Product
    {
        public class ProductMD
        {
            public int ProductID { get; set; }
            [Display(Name = "產品名稱")]
            [Required(
                ErrorMessageResourceType = typeof(ProductResource),
                ErrorMessageResourceName = "ProductName")]
            public string ProductName { get; set; }
        }
    }
}

scaffoldColumn、Required是验证属性。这样就可以把验证属性及规则移到不被T4所影响的类中,其他需要设置验证属性的类重复步骤2~步骤7即可。

以上是关于如何避免在EF自动生成的model中的DataAnnotation被覆盖掉的主要内容,如果未能解决你的问题,请参考以下文章

EF DataBase First生成model的验证

EF Core Model更新迁移

EF Core中的DB First与Code First

EF中三大开发模式之DB First,Model First,Code First以及在Production Environment中的抉择

EF6:如何避免循环引用?

EF如何避免.select中的相同数据