ORM組件 ELinq (四)-映射配置之FluentAPI


  上篇介紹了基於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方式的映射配置。

  技術支持:

  1. 官方網站
  2. Nuge 下載頁面
  3. ORM組件 ELinq系列
  4. ORM組件 ELinq 更新日志
  5. ORM組件 ELinq 使用答疑
  6. 在我的博客留言,我會盡可能地抽時間來答復大家的問題。
  7. 加入 ELinq用戶的 QQ群(271342583)。

   謝謝大家的閱讀,麻煩大伙點一下推薦,再次謝謝大家。 ^_^


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM