.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里面写代码了

  static void Main(string[] args){Stopwatch S = new Stopwatch();  //秒表对象 计时S.Start();            var DBContext = new CLNContext();            foreach (var item in DBContext.NT_Photo){Console.WriteLine(item.PostIP);}Console.WriteLine(S.Elapsed);Console.ReadKey();}

 

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

 

Dapper

1.同样新建控制台程序

2. NuGet引用Dapper

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

using System;

using System.Collections.Generic;

using System.Configuration;

using System.Data.SqlClient;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Dapper;

using System.Diagnostics;

using System.Threading;


namespace DapperForsql

{

    class Program

    {

        static void Main(string[] args)

        {

            

            Stopwatch w = new Stopwatch();

            w.Start();

            var str = "data source=.;initial catalog=CLN20140830;integrated security=True";

            SqlConnection Con = new SqlConnection(str);

            var list = Con.Query<NT_Photo>("select * from NT_Photo");


            foreach (var item in list)

            {

                Console.WriteLine(item.PostIP);

            }

            Console.WriteLine(w.Elapsed);

            Console.ReadKey();

        }

    }

}

 

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

 

 

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

 

PetaPoco

1.同样新建控制台程序

2.使用NuGet引用PetaPoco组件

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

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

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

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

   static void Main(string[] args){           var Context = new CLNContext.CLNContextDB();Stopwatch s = new Stopwatch();s.Start();            var list = Context.Query<NT_Photo>("select * from NT_Photo");            foreach (var item in list){Console.WriteLine(item.PostIP);}Console.WriteLine(s.Elapsed);Console.ReadKey();}

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

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

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

 NT_Photo PP = new NT_Photo(); var res= PP.Insert();  

//res就是返回插入的数据的ID

对比结果:

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

NT_Photo 600多条数据

EF            ------   5.9秒

Dapper     -------  3.0秒

PetaPoco   -------  2.4秒

 

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

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


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

原文地址:http://www.cnblogs.com/myshowtime/p/5951270.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大家都在说的分布式系统到底是什么

转载自 大家都在说的分布式系统到底是什么随着大型网站的各种高并发访问、海量数据处理等场景越来越多&#xff0c;如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。为了解决这样一系列问题&#xff0c;大型网站的架构也在不断发展。提高大型网站的高可用架…

2015c语言9月答案,2015年9月计算机二级C语言预测题答案

2015年9月计算机二级C语言预测题答案一、 选择题1、B 2、C 3、D 4、C 5、C 6、D 7、C 8、D 9、C 10、D11、D 12、D 13、B 14、B 15、A 16、D 17、B 18、B 19、C 20、D二、 阅读程序题(1) 6&#xff0c;8 (2) 3.141593,3.1416,3.142 (3) 4 (4) 2&#xff0c;4 (5) 8三、 程序填空…

Redis集群~StackExchange.Redis(10月6号版1.1.608.0)连接Twemproxy支持Auth指令了

对于StackExchange.Redis这个驱动来说&#xff0c;之前的版本在使用Proxy为Twemproxy代理时&#xff0c;它是不支持Password属性的&#xff0c;即不支持原始的Auth指令&#xff0c;而我也修改过源代码&#xff0c;为CommandMap添加了Auth但最后测试的结果还是失败了&#xff0c…

使用JDOM2.0.4 操作/解析xml

转载自 使用JDOM2.0.4 操作/解析xml一、解析xml内容 xml文件内容:<?xml version"1.0" encoding"utf-8"?> <RETVAL successtrue> <Shop><sid>1</sid><name>北京鑫和易通贸易有限公司</name></Shop> &l…

c语言关于计算的函数,问个c语言题目,关于一个计算器的有参有返回函数!!!...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼printf("toM");scanf("%d",&toM);if(toM0)printf("错误&#xff0c;除数不能为0\n");else{resultarith_compliment(toN,toM);printf("\n%d",toN);printf("%%");printf(&quo…

TypeScript 2.0 已发布

微软最近发布了TypeScript 2.0&#xff0c;该版本提供了简化的声明文件获取、Non-nullable类型&#xff0c;以及Readonly修饰符。 TypeScript项目经理Daniel Rosenwasser称&#xff0c;他们团队对于该版本“紧随ECMAScript规范&#xff0c;为JavaScript库和工具提供了更广泛的支…

springboot创建项目2 开发环境的搭建

我也学习了一下 才想着去写个对应的服务器 前端已经全部搭建好了 有很多的坑 你们就不用再次采坑了 我只讲其中的 服务器部分 中间有好多 以后补充吧。。。。

XML解析(二),DOM解析XML

转载自 XML解析&#xff08;二&#xff09;&#xff0c;DOM解析XML上篇文章向大家介绍了SAX解析XML,为了这篇文章理解起来更加方便&#xff0c;所以还没看过SAX解析XML文章的&#xff0c;请戳这【XML解析&#xff08;一&#xff09;】SAX解析XML &#xff0c;这次给大家带来X…

如何通过反射将字符串转换为类

package org.entity; /*** 本案例演示如何通过反射将字符串转换为类* */ public class Test {public static void main(String[] args) {String user "org.entity.User";//字符串是该类的全限定名try {Class clzz Class.forName(user);Object classObjclzz.newInst…

在C语言的函数定义中 如果不需要返回结果,在C语言的函数定义中,如果不需要返回结果,就可以省略return语句...

语言义中语句数定省略保险般来能一几项的职以下说有。来源统计济数据的主要调查得社会经是获&#xff0c;需要包括如下容(的内应该。具体是指&#xff0c;结果积反映房空置面商品&#xff0c;而尚未出屋期末报告工可供销的房出租出租已竣是指售和售或。语言义中语句表现心理学的…

如何将 Microsoft Bot Framework 链接至微信公共号

说到 Microsoft Bot Framework 其实微软发布了已经有一段时间了&#xff0c;有很多朋友可能还不太了解&#xff0c;微软Bot的功能今天我给大家简单的介绍一下&#xff0c;Bot Framework的开发基础以及如何使用Bot Framework和我们的一个现有的三方客服&#xff08;例如一个微信…

XML解析(一),SAX解析XML

转载自 XML解析&#xff08;一&#xff09;&#xff0c;SAX解析XML一、概述SAX&#xff0c;全称Simple API for XML&#xff0c;是一种以事件驱动的XMl API&#xff0c;是XML解析的一种新的替代方法&#xff0c;解析XML常用的还有DOM解析&#xff0c;PULL解析&#xff08;Andr…

go编译库给c语言函数返回值,go语言 函数return值的几种情况

IOS开发基础知识--碎片361:tabBarController跳转到另一个一级页面 当我们用tabBarController时,若已经到其中一个TabBar的子页,又要跳转到某一个一级的页面时,可以这样写 //这样就可以避免跳 ...MapReduce的MapTask任务的运行源码级分析TaskTracker任务初始化及启动task源码级分…

编程语言的发展趋势及未来方向(3):函数式编程

关于声明式编程的还有一部分重要的内容&#xff0c;那便是函数式编程。函数式编程已经有很长时间的历史了&#xff0c;当年LISP便是个函数式编程语言。除了LISP以外我们还有其他许多函数式编程语言&#xff0c;如APL、Haskell、Scheme、ML等等。关于函数式编程在学术界已经有过…

idea中@Data标签getset不起作用

原 idea中Data标签getset不起作用 2017年06月08日 11:22:40 seapeak007 阅读数 27070 spring cloud中使用Data标签&#xff0c;不用手动添加get set方法&#xff0c;但是如果项目中其他类中使用getset方法&#xff0c;如果报错&#xff0c;原因是idea中没有添加Lombok插件&a…

浅析SAX,DOM,JAXP,JDOM与DOM4J之间的关系

转载自 浅析SAX,DOM,JAXP,JDOM与DOM4J之间的关系众所周知&#xff0c;SAX与DOM是JAVA中两大核心XML解析API类库&#xff0c;而JAXP,JDOM与DOM4J都是基于这两大核心API而衍生出来的。今日兴起看了看相关资料&#xff0c;写篇文章总结总结^.^。 SAX与DOM 首先需要说明白的是SAX…

调用反射类的方法

package org.entity;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;/*** 本案例演示如何通过反射将字符串转换为类* */ public class Test2 {public static void main(String[] args) {String user "org.entity.User";//字…

android 新的布局,Android新布局方式ConstraintLayout快速入门教程

前言在android开发中&#xff0c;我们通常是手写布局&#xff0c;很少会用拖动来写布局&#xff0c;虽然constraintlayout在i/o上以拖动来展现了各种功能&#xff0c;我估计在以后开发中&#xff0c;程序员还是习惯手撸代码。我自己试着拖着用了一下&#xff0c;用得不是很明白…

编程语言的发展趋势及未来方向(2):声明式编程与DSL

这里先从声明式&#xff08;Declarative&#xff09;编程谈起。 目前我们在编写软件时大量使用的是命令式&#xff08;Imperative&#xff09;编程语言&#xff0c;例如C#&#xff0c;Java或是C等等。这些语言的特征在于&#xff0c;写出的代码除了表现出“什么&#xff08;Wha…