EF、Dapper、NHibernate等ORM框架的比较及优缺点

什么是ORM?

ORM的全称是Object Relational Mapping,即对象关系映射。它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。

ORM实现原理

对象到数据库的映射; 对象与数据库数据的互相转换;

重量级ORM,

以EntityFramework、NHibernate为代表

优点 

面向对象方式访问数据库,摆脱SQL 可移植性强,支持所有流行的数据库 面向接口的设计,可扩充性强 对事务、缓存(一级缓存)有良好的封装及配置 

缺点 

比较复杂,学习曲线大; 

处理对象关联很容易出错;

不适合统计查询系统;

对于多表连查,复杂的sql实现比较复杂,而且有可能需要借助其他方案; 

自动生成的sql查询执行效率低; 

对于大数据量、高负载场景需要慎重考虑; 

实现良好的二级缓存很困难,并且只能定制;

轻量级ORM

以dapper为代表,并且是半自动的。也就是说实体类都要自己写,Dapper相当于Java里的Mybatis。

优点:

1、开源、轻量、小巧(单文件,代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll.)、上手容易。支持poco及动态类型,缩写词:POCO's (plain old CLR objects)。

2、支持的数据库还蛮多的, Mysql,SqlLite,Sqlserver,Oracle等一系列的数据库。

3、执行效率高,Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。

使用poco时,属性与数据库表的映射无法灵活配置,难以实现Repository模式


EF相对于ado.net 的优点

1)开发效率高,Entity Framework的优势就是拥有更好的LINQ提供程序、文档,并且是由微软所支持的,用EntityFramework就是开发速度快(当然,那是在会linq的基础上),智能感知(也是linq支持的结果),通过实体、关系型数据库表之间的映射,使开发人员可以通过操作表实体而间接的操作数据库,大大的减少了代码量。不用定义实体类那些东西了。直接与数据库中模型结合起来了,开发人员完全可以根据面向对象的思维进行软件的开发。

2)可以使用三种设计模式中的ModelFirst来设计数据库,而且比较直观

3)可以跨数据库,只需要在配置文件中修改连接字符串

4)与vs结合的比较好

EF的缺点

EF的Context上下文不是线程安全的,你不应该在整个Service上使用一个Context上下文。

EF的性能表现不太好,它的性能不如ADO,开发无法控制SQL语句的生成;频繁插入操作(Insert)不适用, EF不支持大数据Bulk 插入

可维护性差,EF产生查询,他们是难以维护的,它并不能很好地支持映射到不规范的表;它的概念模型,关系模型等全部都放在一个edmx文件里面,过于庞大,并不利于修改


NHibernate优点和缺点:

NHibernate优点:

1.完全的ORM框架。

NHibernate对数据库结构提供了较为完整的封装,它将数据库模式映射为较完全的对象模型,支持封装,继续机制,功能较强大,比一般的ORM灵活性高。

开发人员可以完全按照对象模型操纵数据库。

2.代码自动生成,减少代码和sql的开发量,使开发人员摆脱开sql,ado.net和事务,缓存等底层。

NHibernate的O/R Mapping实现了PO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员往 往只需定义好了PO 到数据库表的映射关系,即可通过NHibernate提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练把握, NHibernate 会根据制定的存储逻辑,自动生成对应的SQL 并调用ADO.NET接口加以执行。NHibernate有工具可以直接根据数据库模式生成po类,或者通过在代码中添加Attribute属性自动生成 配置文件。

这些都减少了开发工作量。

3.较好的文档支持。

NHibernate的代码可读性和文档都比较好。

缺点:

1.较复杂,学习曲线大。

2.对数据库模式有较高的要求。NHibernate需要数据库有良好的设计和比较完善的约束。

3.不适合统计查询系统。对于多表连查,复杂的sql实现比较复杂,而且有可能需要借助其他方案。

4.需要一些xml配置。

------

ORM框架

1.NHibernate 一个传统的ORM,移植于java的Hibernate,3.0后发展迅速,提供FluentMap和FluentConfig,支持Linq,支持HQL和NativeSQL,支持一级缓存和二级缓存,丰富的ID生成策略,更多的拦截事件暴露,支持常见的所有数据库,缺点就是配置选项有点多,初学者无处下手

2.EntityFramework 微软官方出的ORM,配置简单,比NH更好的Linq支持,工具支持和较低的学习门槛,命名约定配置,支持CodeFirst DbMigration(在开发时,不能用在生产环境中),缺点就是不支持批量操作(第三方库EntityFramework.Extension扩展了这一点,还做了缓存),无原生的二级缓存,,单调的ID生成方式,不支持多数据库(很多数据库如MySql都对EF提供了支持,但是bug多多,有稳定的商业库可以选择),还有单一的配置方式(当你想从程序集动态加载model到DbContext中时,你就会知道就多捉鸡)

3.Dapper StackOverflow开源的一个MiniOrm,性能和原生ado.net相近,0配置,强类型支持.缺点同样是有小bug,较弱的LINQ支持(只找到一个MSSQL的linq插件)有两个关于Dapper的扩展,一个叫Dapper.Extension,一个叫Dapper.Rainbow.Mysql.这两个扩展可能更接近传统意义上的ORM

4.ServiceStack.OrmLite 另外一个MiniORM,性能仅次于Dapper,支持大部分的数据库,比Dapper丰富的多的API和更好的强类型lambda表达式查询条件支持,映射0配置,也支持以Attribute配置,支持表的创建和删除

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容