Entity Framework与ADO.Net及NHibernate的比较
什么是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配置。
目前.NET(C#)中比较流行的ORM框架,比如(以下框架均为开源框架,托管于github上):
- SqlSugar (国内)
- Dos.ORM (国内)
- Chloe (国内)
- StackExchange/Dapper (国外)
- Entity Framework (EF) (国外)
- NHibernate (国外)
- ServiceStack/ServiceStack.OrmLite (国外)
- linq2db (国外)
- Massive (国外)
- PetaPoco (国外)
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配置,支持表的创建和删除
Entity Framework与ADO.Net及NHibernate的比较的更多相关文章
- Entity Framework与ADO.NET批量插入数据性能测试
Entity Framework是.NET平台下的一种简单易用的ORM框架,它既便于Domain Model和持久层的OO设计,也提高了代码的可维护性.但在使用中发现,有几类业务场景是EF不太擅长的, ...
- 一个Entity Framework、ADO.NET查询性能测试
Entity Framework自然是会比ADO.NET性能慢点,这个不多说了.直接上结果. 本该用测试项目的,不过我建了个aspx.下面是随便测20遍得到的结果 补充!!把12行改成 list = ...
- ADO.NET-EF:ADO.NET Entity Framework 百科
ylbtech-ADO.NET-EF:ADO.NET Entity Framework 百科 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 ...
- Entity Framework 6 vs NHibernate 4
This article is dedicated to discussing the latest releases of the NHibernate and Entity Framework. ...
- APS.NET MVC + EF (02)---ADO.NET Entity FrameWork
2.1 Entity Framework简介 Ado.net Entity Framework 是Microsoft推出的ORM框架. 2.1.1 什么是ORM 对象关系映射(Object Relat ...
- Entity Framework 学习
Entity Framework 学习初级篇1--EF基本概况 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry. ...
- 重新认识了下Entity Framework
什么是Entity Framework Entity Framework是一个对象关系映射O/RM框架. Entity Framework让开发者可以像操作领域对象(domain-specific o ...
- 2、ASP.NET MVC入门到精通——Entity Framework入门
实体框架(Entity Framework)简介 简称EF 与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...
- Entity Framework 基于方法的查询语法
实体框架(Entity Framework )是 ADO.NET 中的一套支持开发面向数据的软件应用程序的技术. LINQ to Entities 提供语言集成查询 (LINQ) 支持,它允许开发 ...
随机推荐
- Linux[Fedora]查找文件包含的字段
find 与 grep组合查找 find . –name '文件类型' | xargs grep –n '查找内容'文件类型可正则表达式通配, [.]表示当前目录下进行查找,也可自由指定目录.比如: ...
- python中mysqldb的用法
1.引入MySQLdb库 import MySQLdb 2.和数据库建立连接 conn=MySQLdb.connect(host="localhost",user="ro ...
- Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对WeakHashMap进行学习.我们先对WeakHashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用WeakHashMap.第1部分 WeakHashMap介绍 ...
- 2-Fedora 17系统安装准备
在安装Fedora 17系统之前应做好准备工作,这些准备工作包括了解安装系统的硬件要求,Linux系统磁盘分区方案和挂载目录以及制作安装引导盘 学习重点: 硬件要求 硬件兼容性 分区方案 学习内容: ...
- ARC的原理详解
1,ARC的本质 ARC本质是NSAutoreleasePool的直接应用, @autorelease{ return UIApplicationMain(argc, argv, nil, NSStr ...
- 从〇开始构架前端(NLDV框架)
从〇开始构架前端(NLDV框架) 框架 设计模式 摘要:一个普通应用,大到微信, 小到豆瓣FM,必不可少的都包括四部分:Network.Logic.Data.View(NLDV).如何把他们组合起来, ...
- CSS样式----图文详解(二):css属性
主要内容 CSS的单位 字体属性 文本属性 背景属性 列表属性 盒子模型 定位属性:position.float.overflow.z-index等 导航栏的制作 鼠标的属性cursor 滤镜的介绍 ...
- NOIP2000乘积最大[序列DP]
题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...
- 网络之Ip地址
0.0.0.0---255.255.255.255 Ip地址分类(D.E)不对外开放 网络类别 最大网络数 IP地址范围(,唯一的,花钱的) 最大主机数 私有IP地址范围 (做内网ip,不可直接访问公 ...
- ural One-two, One-two 2
One-two, One-two 2 Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...