惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
月光博客
月光博客
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Visual Studio Blog
博客园 - 叶小钗
博客园 - 司徒正美
美团技术团队
博客园_首页
宝玉的分享
宝玉的分享
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News

博客园 - 风云

Vane.Dispatch 1.0.0 发布:一个与容器、传输层零耦合的 .NET 服务分发引擎 MiniLog 1.0 GA 发布:零分配、零依赖的 .NET 高性能日志框架 从实战到生产:Acl.Excel 八大场景与避坑指南(终篇) 写入分配砍掉 63%:Acl.Excel 绕过 XmlWriter 字节直写 零依赖纯 C# DEFLATE 引擎:2916 行移植 libdeflate 一个 42KB 的 Excel 如何撑爆 4.5PB?Acl.Excel 8 层防御 Acl.Excel 跨库基准:读取最高快 32.8 倍 24B消灭上亿次装箱:Acl.Excel零装箱设计 百万行Excel如何恒定内存?Acl.Excel流式拆解 不依赖 NPOI/ClosedXML,纯 C# Excel 库如何做到 30 倍性能? 2-30 倍性能:Acl.Excel 设计哲学与零依赖 Acl.Excel vs MiniExcel 1.45.0:百万行读写实测,托管内存低至 1/37,QueryFirst 平分秋色 优化纯 C# DEFLATE 压缩器:从 0 到超越 .NET 内置的完整历程 从零实现 DEFLATE 压缩器:纯 C# 移植版如何在 Excel 场景超越 .NET 内置? Docker下构建centos7容器无法使用systemctl命令的解决办法 重新诠释的OSGi规范 让我们的领域逻辑彻底裸奔吧 NLite.Web 组件更新日志 Ndf 组件更新日志 新年首作-ELinq+T4模版引擎制作多文件实体代码生成器 ORM组件 ELinq (五)-映射配置之XML ORM组件 ELinq (三)-映射配置之Attribute NLite 更新日志 ORM组件 ELinq 更新日志 ORM组件 ELinq (二) 映射配置之Table 用户中心 - 博客园 ORM组件 ELinq 系列 国内开源ORM组件 ELinq正式版发布 ORM组件 ELinq (一)首航之旅 年度开源力作-ORM组件 ELinq诞生了
ORM组件 ELinq (四)-映射配置之FluentAPI
风云 · 2013-01-01 · via 博客园 - 风云

  上篇介绍了基于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)。

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