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

推荐订阅源

Microsoft Security Blog
Microsoft Security Blog
Jina AI
Jina AI
量子位
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
S
SegmentFault 最新的问题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
博客园 - 聂微东
美团技术团队
Last Week in AI
Last Week in AI
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
V
Visual Studio Blog
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog

博客园 - 风云

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 (四)-映射配置之FluentAPI ORM组件 ELinq (三)-映射配置之Attribute NLite 更新日志 ORM组件 ELinq 更新日志 ORM组件 ELinq (二) 映射配置之Table 用户中心 - 博客园 ORM组件 ELinq 系列 国内开源ORM组件 ELinq正式版发布 年度开源力作-ORM组件 ELinq诞生了
ORM组件 ELinq (一)首航之旅
风云 · 2012-12-04 · via 博客园 - 风云

      上一篇 年度开源力作,国产Linq ORM又一框架诞生了,这篇就开始首航之旅

  一: 开始ELinq 之旅

    这个教程演示了如何在微软开发环境里搭建一个ELinq例子. 使用了以下工具:

  1. 控制台应用程序.

  2. Access 2007 Northwind 数据库, ELinq也支持其他数据库,更换数据库要做的仅仅是在配置文件里更改数据库方言和数据库驱动。

  3. Visual Studio .NET 2010- 开发环境.

  4. SDK4.0 (当然也支持3.5)
  5. Nuget 包管理器备注:Nuget安装方法和步骤:  http://docs.nuget.org/docs/start-here/installing-nuget

       Nuget使用说明:  http://docs.nuget.org/docs/start-here/using-the-package-manager-console

    1. 我们创建一个控制台项目.项目命名为QuickStart。 打开项目,添加ELinq.dll引用。

    2. 通过Nuget添加ELinq 的引用:在Nuget控制台中输入:install-package ELinq, Nuget会自动的将你引用的库的这个库的依赖文件添加到你的项目引用中.

    3. 配置数据库连接信息。添加App.Config 文件,并添加如下的配置信息

  <connectionStrings>
    <clear/>
    <add providerName ="System.Data.OleDb" name="Northwind" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Northwind.mdb;Persist Security Info=True"/>
  </connectionStrings>

       providerName:用来指示DbProviderFactory的标志类型,通过它来加载DbProviderFactory,下面我枚举一下常用的providerName

  •  OleDb        :System.Data.OleDb
  •  Odbc         :System.Data.Odbc
  •  SqlServer   :System.Data.SqlClient
  •  SQLite       :System.Data.SQLite
  •  SqlCe35     : System.Data.SqlServerCe.3.5
  •  SqlCe40     : System.Data.SqlServerCe.4.0
  •  MySQL       : MySql.Data.MySqlClient
  • Oracle         : System.Data.OracleClient
  • Oracle_ODP : Oracle.DataAccess.Client

       name: 用来标志是哪一个连接字符串,如果项目中需要多个数据库,那么可以添加多个连接字符串配置,这些配置通过name来区别,从而达到支持多数据库的目的

       connectionString:存储连接字符串的内容

   二:数据表Customers

 三:实体类 

    public class Customer
    {
        public string CustomerID;
        public string ContactName;
        public string CompanyName;
        public string Phone;
        public string City;
        public string Country;
    }

 四:映射Customers表

     首先添加:using NLite.Data;

     然后修正第三步的Customer实体类如下:

   [Table(Name = "Customers")]
    public class Customer
    {
        [Id]
        public string CustomerID;
        [Column]
        public string ContactName;
        [Column]
        public string CompanyName;
        [Column]
        public string Phone;
        [Column]
        public string City;
        [Column]
        public string Country;
    }

 五:与Customer同舞

       1. 创建DbConfiguration

   DbConfiguration在ELinq里面是一个单个数据存储的概念(在SQLServer里面就是对应一个database),多数据库操作可以使用创建多个连接字符串配置以及在程序里创建多个DbConfiguration对象来实现。

 var dbConfiguration = DbConfiguration.Configure("Northwind");

    DbConfiguration代表一个数据库。 NLite.Data通过对DbConfiguration().Configure(connectionStringName)的调用来初始化DbConfiguration实例。通过DbConfiguration实例创建一个IDbContext。 在创建 IDbContext之前,你可以访问Configuration来设置其他属性(甚至修改映射的元数据)。 我们应该在哪儿创建DbConfiguration,在我们的程序中又如何访问它呢?

 DbConfiguration通常只是被初始化一次,比如说在Application_Start事件里来初始化。 这意味着你不应该在ASP.NET页面中把它作为一个实例变量来持有,而应该放在其他地方。进一步的说, 我们需要使用单例(Singleton)模式,我们才能更容易的在程序中访问 DbConfiguration。

     2. 注册OR映射

     经过了实体类Customer和数据表Customers的映射,现在需要把它们的映射关系注册到DbConfiguration对象中,这样就可以使用IDbSet操作了。

 dbConfiguration.AddClass<QuickStart.First.Customer>();

    3. 为了方便跟踪Sql输出,注册控制台日志

dbConfiguration.SetSqlLogger(() => new SqlLog(Console.Out));

    4. 创建IDbContext

     DbContext 里面封装了数据库连接对象,代表一个连接对象,使用完毕后要注意及时释放

 using (var ctx = dbConfiguration.CreateDbContext())
 {
 }

  5. 创建IDbSet 玩转Linq

 var q= ctx.Set<QuickStart.First.Customer>();

    1): 添加一条记录

 var c = new Customer
 {
      CustomerID = "XX1",
      CompanyName = "Company1",
      ContactName = "Contact1",
      City = "Seattle",
      Country = "USA"
   };
   // 执行PO插入
   q.Insert(c);

      控制台输出的SQL信息如下:

INSERT INTO [Customers]([CustomerID], [ContactName], [CompanyName], [Phone], [City], [Country])
VALUES (p0, p1, p2, p3, p4, p5)
-- p0:(DbType = String,Value = XX1)
-- p1:(DbType = String,Value = Contact1)
-- p2:(DbType = String,Value = Company1)
-- p3:(DbType = String,Value = NULL)
-- p4:(DbType = String,Value = Seattle)
-- p5:(DbType = String,Value = USA)

  2):通过主键查询

 var c2 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
 Console.WriteLine(c2.CustomerID);

  控制台输出的SQL信息如下:

SELECT TOP 1 t0.[CustomerID], t0.[ContactName], t0.[CompanyName], t0.[Phone], t0.[City], t0.[Country]
FROM [Customers] AS t0
WHERE (t0.[CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)

XX1

   3): 基于Linq的局部更新

  //基于Linq的局部更新
 q.Update(new { CompanyName = "ddd" }, p => p.CustomerID == c.CustomerID);

  //查询
  var c3 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
  Console.WriteLine(c3.CompanyName);

     控制台输出的SQL信息如下:

UPDATE [Customers]
SET [CompanyName] = p1
WHERE ([CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)
-- p1:(DbType = String,Value = ddd)

SELECT TOP 1 t0.[CustomerID], t0.[ContactName], t0.[CompanyName], t0.[Phone], t0.[City], t0.[Country]
FROM [Customers] AS t0
WHERE (t0.[CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)

ddd

     4:) 基于Linq的删除

 //基于Linq的删除
 q.Delete(p => p.CustomerID == c.CustomerID);

  var c4 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
  if (c4 != null)
      Console.WriteLine("Delete failed");

   控制台输出的SQL信息如下:

DELETE FROM [Customers]
WHERE ([CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)

SELECT TOP 1 t0.[CustomerID], t0.[ContactName], t0.[CompanyName], t0.[Phone], t0.[City], t0.[Country]
FROM [Customers] AS t0
WHERE (t0.[CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)

   六:全部代码

       public static void Main(params string[] args)
        {
            var dbConfiguration = DbConfiguration.Configure("Northwind");

            dbConfiguration.AddClass<QuickStart.First.Customer>();

            dbConfiguration.SetSqlLogger(() => new SqlLog(Console.Out));

            using (var ctx = dbConfiguration.CreateDbContext())
            {
                var q = ctx.Set<QuickStart.First.Customer>();
                var c = new Customer
                {
                    CustomerID = "XX1",
                    CompanyName = "Company1",
                    ContactName = "Contact1",
                    City = "Seattle",
                    Country = "USA"
                };
                // 执行PO插入
                q.Insert(c);

                //查询
                var c2 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
                Console.WriteLine(c2.CustomerID);

                //基于Linq的局部更新
                q.Update(new { CompanyName = "ddd" }, p => p.CustomerID == c.CustomerID);

                //查询
                var c3 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
                Console.WriteLine(c3.CompanyName);

                //基于Linq的删除
                q.Delete(p => p.CustomerID == c.CustomerID);

                var c4 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
                if (c4 != null)
                    Console.WriteLine("Delete failed");
            }

            Console.Read();
        }

   七:总结

  在这个短小的教程中,我们对ELinq的浅尝即止。ELinq作为一个数据库访问层,是与你的程序紧密相关的。 通常情况下,所有其他层次都依赖持久机制。

     最后附上Demo代码:https://files.cnblogs.com/netcasewqs/QuickStart.zip

技术支持:

  1. 官方网站
  2. Nuge 下载页面
  3. ORM组件 ELinq系列
  4. ORM组件 ELinq 更新日志
  5. ORM组件 ELinq 使用答疑
  6. 在我的博客留言,我会尽可能地抽时间来答复大家的问题。
  7. 加入 ELinq用户的 QQ群(271342583)。

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