什么是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相比下来都是比较轻的,而且用起来的话也是非常灵活的。哪一个更适合你的项目,用起来更顺手,才是最好的选择方案。