• 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)。

       谢谢大家的阅读,麻烦大伙点一下推荐,再次谢谢大家。 ^_^

  • 相关阅读:
    iOS微信支付
    iOS登录及token的业务逻辑(没怎么用过,看各种文章总结)
    IOS 支付宝支付开发流程
    iOS SDWebImage实现原理
    站立会议1
    作业六:团队项目——编写项目的Spec
    作业5
    站立会议8
    站立会议 3
    站立会议 2
  • 原文地址:https://www.cnblogs.com/netcasewqs/p/2841555.html
Copyright © 2020-2023  润新知