如何避免在EF自動生成的model中的DataAnnotation被覆蓋掉
阿新 • • 發佈:2017-08-17
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被覆蓋掉