Introduction 最近剛好有人詢問,就乾脆記錄下來好了。
Conetent 主要是使用在 Model 欄位上;
例如一個 MVC 5.x 專案,使用 DataBase first 的 Model ,所以該 Model 是經由 T4 範本產生,如果將修改項目寫在產生的 model 類別上,當需要重新更新資料庫對應的時候,所修改的項目就會被覆蓋掉了。
所以這時候使用 MetaData 的方式處理,既可以不變動自動產生的對應類別,又可以自訂需要的驗證在 MetaData 上或是添加顯示名稱等等。
作法 因為 EntityFramework 產生的資料表對應類別,都會是 partial 類別,所以可以很好去擴充。 首先可以建立一個資料夾專門放置 MetaData,然後打開想要建立 MetaData 的資料表對應類別
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 namespace MetaData.Models { using System; using System.Collections.Generic; public partial class Orders { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage" , "CA2214:DoNotCallOverridableMethodsInConstructors" ) ] public Orders ( ) { this .Order_Details = new HashSet<Order_Details>(); } public int OrderID { get ; set ; } public string CustomerID { get ; set ; } public Nullable<int > EmployeeID { get ; set ; } public Nullable<System.DateTime> OrderDate { get ; set ; } public Nullable<System.DateTime> RequiredDate { get ; set ; } public Nullable<System.DateTime> ShippedDate { get ; set ; } public Nullable<int > ShipVia { get ; set ; } public Nullable<decimal > Freight { get ; set ; } public string ShipName { get ; set ; } public string ShipAddress { get ; set ; } public string ShipCity { get ; set ; } public string ShipRegion { get ; set ; } public string ShipPostalCode { get ; set ; } public string ShipCountry { get ; set ; } public virtual Customers Customers { get ; set ; } public virtual Employees Employees { get ; set ; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage" , "CA2227:CollectionPropertiesShouldBeReadOnly" ) ] public virtual ICollection<Order_Details> Order_Details { get ; set ; } public virtual Shippers Shippers { get ; set ; } } }
注意一下,類別檔案與 MetaData 的檔案需要在同一 namespace 下,然後使用 MeteData 需要引用 System.ComponentModel.DataAnnotations
。
1 2 3 4 5 6 7 8 9 10 11 12 namespace MetaData.Models { [MetadataType(typeof(OrdersMetadata)) ] public partial class Orders { public class OrdersMetadata { [DisplayName("測試測試" ) ] public Nullable<decimal > Freight { get ; set ; } } } }
Reference 示範程式碼 採用北風資料庫進行。