上篇介紹了基於Attribute的ELinq映射配置方式,本篇將給大家介紹基於FluentAPI的映射配置方式。
該篇仍然以Northwind數據庫的Customers表和Orders 表為例,客戶和訂單是一對多關系。
1. Customer和Order的實體類
public class Customer { public string Id; public string ContactName; public string CompanyName; public string City; public string Country; public string Phone; } public class Order { public int OrderID; public string CustomerID; public DateTime OrderDate; }
2. 引入FluentAPI的命名空間:using NLite.Data.Mapping.Fluent;
3. 創建CustomerMap 映射類
class CustomerMap : ClassMap<Customer> { public CustomerMap() { //設置TableName映射 TableName("Customers"); // 設置主鍵映射,把Id屬性映射到數據表的CustomerId列上 Id(e => e.Id).ColumnName("CustomerId"); //列映射 Column(e => e.ContactName).ColumnName("ContactName"); Column(e => e.CompanyName); Column(e => e.City); Column(e => e.Country); //Phone 字段忽略映射 Ignore(e => e.Phone); } }
4. 創建OrderMap映射類
class OrderMap : ClassMap<Order> { public OrderMap() { TableName("Orders"); //設置主鍵映射,並且設置為自動增一的 Id(e => e.OrderID).DbGenerated(); Column(e => e.CustomerID); Column(e => e.OrderDate); } }
5. 建立一對多關系映射
public class Customer { public string Id; public string ContactName; public string CompanyName; public string City; public string Country; public string Phone; public IList<Order> Orders; } class CustomerMap : ClassMap<Customer> { public CustomerMap() { //設置TableName映射 TableName("Customers"); // 設置主鍵映射,把Id屬性映射到數據表的CustomerId列上 Id(e => e.Id).ColumnName("CustomerId"); //列映射 Column(e => e.ContactName).ColumnName("ContactName"); Column(e => e.CompanyName); Column(e => e.City); Column(e => e.Country); //Phone 字段忽略映射 Ignore(e => e.Phone); //一對多映射 Association(e => e.Orders).ThisKey("Id").OtherKey("CustmerId"); } }
6. 建立多對一映射
public class Order { public int OrderID; public string CustomerID; public DateTime OrderDate; public Customer Customer; } class OrderMap : ClassMap<Order> { public OrderMap() { TableName("Orders"); //設置主鍵映射,並且設置為自動增一的 Id(e => e.OrderID).DbGenerated(); Column(e => e.CustomerID); Column(e => e.OrderDate); //多對一映射 Association(e => e.CustomerID).ThisKey("CustomerID").OtherKey("Id"); } }
7. 注冊Fluent的ClassMap到DbConfiguration對象中,並建立DbContext
public class Northwind : DbContext { //連接字符串名稱:基於Config文件中連接字符串的配置 const string connectionStringName = "Northwind"; //構造dbConfiguration 對象 static DbConfiguration dbConfiguration = DbConfiguration .Configure(connectionStringName) .SetSqlLogger(() => new SqlLog(Console.Out)) .AddClass(new CustomerMap()) .AddClass(new OrderMap()) ; public Northwind() : base(dbConfiguration) { } public readonly IDbSet<Customer> Customers; public readonly IDbSet<Order> Orders; }
8. 前面介紹的都是基於強類型的ClassMap,ELinq也支持匿名ClassMap的映射和注冊
public class Customer { public string Id; public string ContactName; public string CompanyName; public string City; public string Country; public string Phone; public IList<Order> Orders; } public class Order { public int OrderID; public string CustomerID; public DateTime OrderDate; public Customer Customer; } public class Northwind : DbContext { //連接字符串名稱:基於Config文件中連接字符串的配置 const string connectionStringName = "Northwind"; //構造dbConfiguration 對象 static DbConfiguration dbConfiguration = DbConfiguration .Configure(connectionStringName) .SetSqlLogger(() => new SqlLog(Console.Out)) .AddClass<Customer>(m=> { //設置TableName映射 m.TableName("Customers"); // 設置主鍵映射,把Id屬性映射到數據表的CustomerId列上 m.Id(e => e.Id).ColumnName("CustomerId"); //列映射 m.Column(e => e.ContactName).ColumnName("ContactName"); m.Column(e => e.CompanyName); m.Column(e => e.City); m.Column(e => e.Country); //Phone 字段忽略映射 m.Ignore(e => e.Phone); //一對多映射 m.Association(e => e.Orders).ThisKey("Id").OtherKey("CustmerId"); }) .AddClass<Order>(m=> { m.TableName("Orders"); //設置主鍵映射,並且設置為自動增一的 m.Id(e => e.OrderID).DbGenerated(); m.Column(e => e.CustomerID); m.Column(e => e.OrderDate); //多對一映射 m.Association(e => e.CustomerID).ThisKey("CustomerID").OtherKey("Id"); }) ; public Northwind() : base(dbConfiguration) { } public readonly IDbSet<Customer> Customers; public readonly IDbSet<Order> Orders; }
通過上面的例子想必大家對ELinq基於FluentAPI的配置方式也有了一個了解。Fluent方式和Attribute方式相似,Fluent方式實體更干凈,Attribute方式代碼更簡潔。
下一節將介紹基於XML方式的映射配置。
技術支持:
- 官方網站
- Nuge 下載頁面
- ORM組件 ELinq系列
- ORM組件 ELinq 更新日志
- ORM組件 ELinq 使用答疑
- 在我的博客留言,我會盡可能地抽時間來答復大家的問題。
- 加入 ELinq用戶的 QQ群(271342583)。
謝謝大家的閱讀,麻煩大伙點一下推薦,再次謝謝大家。 ^_^