Theme NexT works best with JavaScript enabled

ShunNien's Blog

不積跬步,無以致千里;不積小流,無以成江海。

0%

.Net MVC MetaData

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
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

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

示範程式碼採用北風資料庫進行。

歡迎關注我的其它發布渠道