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

什么是ORM?php

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

ORM实现原理git

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


重量级ORM,github

以EntityFramework、NHibernate为表明sql

优势
面向对象方式访问数据库,摆脱SQL 可移植性强,支持全部流行的数据库 面向接口的设计,可扩充性强 对事务、缓存(一级缓存)有良好的封装及配置
缺点
比较复杂,学习曲线大;
处理对象关联很容易出错;
不适合统计查询系统;
对于多表连查,复杂的sql实现比较复杂,并且有可能须要借助其余方案;
自动生成的sql查询执行效率低;
对于大数据量、高负载场景须要慎重考虑;
实现良好的二级缓存很困难,而且只能定制;

轻量级ORM数据库

以dapper为表明,而且是半自动的。也就是说实体类都要本身写,Dapper至关于Java里的Mybatis。设计模式

优势:缓存

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

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

三、执行效率高,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配置。

 

目前.NET(C#)中比较流行的ORM框架,好比(如下框架均为开源框架,托管于github上):

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.这两个扩展可能更接近传统意义上的ORM4.ServiceStack.OrmLite 另一个MiniORM,性能仅次于Dapper,支持大部分的数据库,比Dapper丰富的多的API和更好的强类型lambda表达式查询条件支持,映射0配置,也支持以Attribute配置,支持表的建立和删除

相关文章
相关标签/搜索