.Net开源微型ORM框架测评

 什么是ORM?

      对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

  • 一般的ORM包括以下四部分:
  • 一个对持久类对象进行CRUD操作的API;
  • 一个语言或API用来规定与类和类属性相关的查询;
  • 一个规定MAPPING METADATA的工具;
  • 一种技术可以让ORM的实现同事务对象一起进行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的优化操作。

本次对比的.NET ORM框架

1. Entity Framework

官网 https://msdn.microsoft.com/zh-cn/data/ef.aspx

2. Dapper

官网 https://github.com/StackExchange/dapper-dot-net

3. PetaPoco

官网 http://www.toptensoftware.com/petapoco/

对比因素

1. 操作的难易程度

2. 执行的效率

3. 跨数据库的使用

Entity Framework

1.新建C#控制台

2. 使用NuGet引用EF组件

项目引用 右键 管理NuGet程序包 在联机里下载并安装Entity Framework

 项目右键 新建 添加 新建项 ADO.NET实体数据模型 

我这里的CLN用的是数据库名

 添加过以后 有一个实体模型数据向导 选择 从数据库生成 下一步 这里是配置数据库连接 新建连接 将App.Config的实体连接设置为CLNContext

然后又出现一个对话框  -- 您要在模型中包含哪些数据库对象,这里把表勾上,点击完成就OK了,然后会弹出两个警告框,这是因为有两个TT模板需要执行,不用管它,确定就行了,这是出现了Edmx数据库模型关系图

接下来就是进入项目的 Program.cs里面写代码了

 1 static void Main(string[] args)
 2 {
 3       Stopwatch S = new Stopwatch();  //秒表对象 计时
 4       S.Start();
 5 
 6       var DBContext = new CLNContext();
 7       foreach (var item in DBContext.NT_Photo)
 8       {
 9          Console.WriteLine(item.PostIP);
10       }
11            
12       Console.WriteLine(S.Elapsed);
13       Console.ReadKey();
14 }

 NT_Photo 表里有600多条数据,这里看到查询的速度还是蛮快的  EF用时5.9秒

Dapper

1.同样新建控制台程序

2. NuGet引用Dapper

Dapper没有EF那么强大,相当于一个SqlHelper,我们需要手动配置连接字符串,这里把刚才EF生成的NT_Photo.cs 模型类,放到项目里面,然后就是就是进入到Program.cs里面写代码了

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Configuration;
 4 using System.Data.SqlClient;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8 using Dapper;
 9 using System.Diagnostics;
10 using System.Threading;
11 
12 namespace DapperForsql
13 {
14     class Program
15     {
16         static void Main(string[] args)
17         {
18             
19             Stopwatch w = new Stopwatch();
20             w.Start();
21             var str = "data source=.;initial catalog=CLN20140830;integrated security=True";
22             SqlConnection Con = new SqlConnection(str);
23             var list = Con.Query<NT_Photo>("select * from NT_Photo");
24 
25             foreach (var item in list)
26             {
27                 Console.WriteLine(item.PostIP);
28             }
29             Console.WriteLine(w.Elapsed);
30             Console.ReadKey();
31         }
32     }
33 }

我们这里用了SqlConnertion对象,因为Dapper是对IDbConnection做了扩展, SqlConnection是实现了IDbConnection,然后在我们引用Dapper的命名空间using Dapper;

 这里可以看到,Dapper比EF更快  Dapper用时3.0秒

PetaPoco

1.同样新建控制台程序

2.使用NuGet引用PetaPoco组件

3.配置App.Config里的连接字符串

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3   <connectionStrings>
4     <add name="CLNContext" connectionString="data source=.;initial catalog=CLN20140830;integrated security=True;" providerName="System.Data.SqlClient" />
5   </connectionStrings>
6     <startup> 
7         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
8     </startup>
9 </configuration>

4. 安装PetaPoco后,同样会自动生成数据库访问上下文和模型Model,这里打开 Models -> Database.tt ,修改 ConnectionStringName = "CLNContext";这里要和App.Config里的连接字符串保持一致,更改过以后保存,会自动生成数据库访问上下文,Models -> Database.tt -> Database.cs

5.准备工作完毕,就是进入正题了,同样进入到 Program.cs 

 1 static void Main(string[] args)
 2 {
 3            
 4      var Context = new CLNContext.CLNContextDB();
 5      Stopwatch s = new Stopwatch();
 6      s.Start();
 7      var list = Context.Query<NT_Photo>("select * from NT_Photo");
 8      foreach (var item in list)
 9      {
10         Console.WriteLine(item.PostIP);
11      }
12      Console.WriteLine(s.Elapsed);
13      Console.ReadKey();
14 }

这里PetaPoco 也有数据库访问上下文CLNContextDB(),不过也是需要写SQL语句的,先看一下查询速度

 在这里可以看到,PetaPoco貌似更快 PetaPoco用时2.4秒

其实PetaPoco更强大的是,它对模型做了增删改查的方法,这就非常方便了

1 NT_Photo PP = new NT_Photo();
2  var res= PP.Insert();  
3 
4 //res就是返回插入的数据的ID

对比结果:

这里可以看到EF,Dapper,PetaPoco 的差别了

NT_Photo 600多条数据

EF            ------   5.9秒

Dapper     -------  3.0秒

PetaPoco   -------  2.4秒

其实EF第一次的话,会慢一些,第一次会把一些模型数据加载到内存中,后面就非常快了,这里贴一个EF 暖机代码

1 //EF暖机    
2 using (var db = new CLNContext())
3 {
4     var objectContext = ((IObjectContextAdapter)db).ObjectContext;
5     var mappingCollection = (System.Data.Entity.Core.Mapping.StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(System.Data.Entity.Core.Metadata.Edm.DataSpace.CSSpace);
6     mappingCollection.GenerateViews(new System.Collections.Generic.List<System.Data.Entity.Core.Metadata.Edm.EdmSchemaError>());
7 }

总结:每个ORM的存在都有它的价值,不能说哪个哪个好,EF是微软自家推出的,很多代码都是自动生成的,一句SQL语句都不用写,确实非常方便,但是EF的包很大,有5M多,而且微软封装好的也不太利于扩展,像写一些复杂的SQl语句就不是很方便了,Dapper 和PetaPoco相比下来都是比较轻的,而且用起来的话也是非常灵活的。哪一个更适合你的项目,用起来更顺手,才是最好的选择方案。

原文地址:https://www.cnblogs.com/lgx5/p/14458363.html