您好,欢迎访问一九零五行业门户网

.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(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里的连接字符串

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(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()); }
总结:每个orm的存在都有它的价值,不能说哪个哪个好,ef是微软自家推出的,很多代码都是自动生成的,一句sql语句都不用写,确实非常方便,但是ef的包很大,有5m多,而且微软封装好的也不太利于扩展,像写一些复杂的sql语句就不是很方便了,dapper 和petapoco相比下来都是比较轻的,而且用起来的话也是非常灵活的。哪一个更适合你的项目,用起来更顺手,才是最好的选择方案。
其它类似信息

推荐信息