1. 程式人生 > >如何避免在EF自動生成的model中的DataAnnotation被覆蓋掉

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

class out 代碼生成 正常 public 擴展名 caf false 執行

摘自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被覆蓋掉