比较NHibernate和Entity Framework
葡萄牙的一位开发者 Ricardo Peres 最近发布了一篇文章,以看起来无偏见的形式对领先的两种 .NET ORM:NHibernate 和 Entity Framework 进行了比较。 我们建议考虑使用这两种框架的人都应该读下他的文章,NHibernate 和 Entity Framework 之间的区别,另外还将指出一些关键的区别。
从架构上看,NHibernate 基于 Java 的 Hibernate ORM。 Ricardo 写道:
在 NHibernate 中,工作单元和配置项以及模型实例都相互独立。 你首先会创建 Configuration 对象,在其中你会指定所有 NHibernate 设置,像要使用的数据库和语言、批处理的大小、映射关系等等,然后你会依此构建 ISessionFactory。 ISessionFactory 会持有与特定数据库绑定的模型和元数据,以及来自于 Configuration 对象的设定,并且,一般每个进程中只有一个实例。 最终,你会基于 ISessionFactory 创建 ISession 的示例,它是工作单元(Unit of Work)以及标识符地图(Identity Map)的 NHibernate 表现形式。 这是一种轻量级的对象,它本质上会根据需要打开和关闭数据库连接,并跟踪与之相关的实体。 ISession 对象很容易创建和销毁,因为所有的模型复杂性都存储在 ISessionFactory 和 Configuration 对象中。
评论者 Morten Mertner 说:“我永远都不会使用 NHibernate。 尽管它拥有很棒的特性列表,但它并非一种能够轻松使用的产品,而且 API 和设计中始终带有遗传自 Java 的味道(同样,很多 Java API 都太企业化,并且架构过于庞大;结果会与你想要的大相径庭)。”
Entity Framework 遵循的是更加传统的 .NET 设计,其中所有一切都封装在单独的ObjectContext 或者 DbContext 中。 这让使用对象更加简单,但是缺点在于“类并没有因此是轻量级的,因为它有与 NHibernate 类似的内容,并且一般不会看到这样的例子:实例可以缓存在字段中。”
对于映射,NHibernate 和 Entity Framework 之间的关键区别在于,前者支持基于 XML 的映射文件,该文件可以独立部署。 在理论上,这让你可以针对不同的数据库 schema 使用相同的对象模型,而不需要重新编译应用程序。 但在实践中很少这么使用。
在很多方面古老一些的 NHibernate 要优于 Entity Framework。 Ricardo 提供了更多细节,并简要地总结如下:
- 关联: 都支持一对一、一对多、多对多,但是 NHibernate 还支持各种排序、未排序和索引的选项。 它甚至还有不变的(immutable)、索引的(indexed)列表。
- 缓存: NHibernate 提供了带有大量实现的二级缓存。 Entity Framework 没有任何对此内建的支持,但是有些增加二级缓存的例子。
- ID 生成: NHibernate 提供了大概十二种策略,这取决于你如何计算。 Entity Framework 只为 SQL Server 提供了主要的三种: 标识符列、GUID、和手动赋值。
- 事件: Entity Framework 只有两种基于事件的扩展点: ObjectMaterialized 和SavingChanges。 “NHibernate 拥有非常丰富的事件模型,暴露了超过 20 种事件,有些针对同步前执行(synchronous pre-execution),有些针对异步后执行(asynchronous post-execution)”。
- 级联: “两种框架都支持集合和关联的级联: 当实体被删除的时候,相关的子实体也会被删除。 NHibernate 还提供了一种特性,可以把子实体上的外键设置为 NULL,而不删除它们。”
- 清理变更: NHibernate 提供了一种自动模式,其中在必要的时候会保存变更,像“如果有一种实体类型的脏实例,而查询是针对这种实体类型执行”。 FlushMode.Auto 实际上是默认值,但偶尔会看到由于自动清除而导致性能问题。
也有一些领域中,Entity Framework 会比 NHibernate 好,比方说:
- 跟踪变更: 尽管两种框架在工作单元级别默认都能够跟踪变化,而 Entity Framework 还提供了自我跟踪实体(self-tracking entities)。
- 整合: Entity Framework 当然会与 Visual Studio 和各种 ASP.NET 以及 WCF 类库有很好的绑定。
- 文档: “这是另一种 Entity Framework 表现非常好的地方: NHibernate 缺少针对初学者的文档,并且也没有与其最新版本同步的最新 API 参考。”
- 查询: Craig 写到:“NHibernate 有更丰富的特性,但有一个领域除外,那就是对 Linq 的支持。 因为对于很多用户来说,Linq 或者其它查询语言都是 ORM 中最可见的部分,它会让人对功能产生错误印象。”
还有某些领域,两种框架都可以做出改进,像批处理功能。 当需要真正支持 SQL 的高级特性——像通用表表达式——的时候,两种 ORM 框架都无法支持 SQL Alchemy。
我们应该发现两个项目都很活跃,经常会有定期的改进。 所以,如果二者都能够满足你的最小需求,那么考虑就更多集中在程序库的设计模式和哲学上,而不是在特性列表上。
比较NHibernate和Entity Framework的更多相关文章
- ADO.NET、NHibernate和Entity Framework的比较
---原文地址:http://www.xuebuyuan.com/2162973.html 1,ADO.NET属于传统的数据访问工具,开发的时候需要我们手动去编写操作数据库的各种操作,当然性能也就不用 ...
- csharp: NHibernate and Entity Framework (EF) (object-relational mapper)
代码生成器: 1. http://www.codesmithtools.com/ 2.https://sourceforge.net/projects/mygeneration/ 3. http:// ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- NHibernate与EF(Entity Framework)的区别
http://www.cnblogs.com/lukun/archive/2011/05/16/2047587.html NHibernate与EF(Entity Framework)的区别 http ...
- Entity Framework 6 vs NHibernate 4
This article is dedicated to discussing the latest releases of the NHibernate and Entity Framework. ...
- 学习Entity Framework 中的Code First
这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家. 最近在对MVC的学习过程中,接触到了Code First这种新的设计模式,感觉很新颖,并且也体验到 ...
- 转载:学习Entity Framework 中的Code First
看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...
- SQLITE WITH ENTITY FRAMEWORK CODE FIRST AND MIGRATION
Last month I’ve a chance to develop an app using Sqlite and Entity Framework Code First. Before I st ...
- Entity Framework学习记录
记录一次ef code first的学习记录 最近想做一套自己的框架,正在寻找合适的ORM,之前参照力软(很早之前的版本了)的底层代码,做了一套自己的增删改查, 但是使用起来总觉得缺了点什么? 所以决 ...
随机推荐
- Senparc.Weixin.MP.Sample 配置redis服务器密码
redis.windows-service.conf中加 requirepass 你的密码 <!-- Cache.Redis连接配置 --> <add key="Cach ...
- 关于VS打开cshtml出现 未能完成该操作。无效指针
关于VS打开cshtml出现 未能完成该操作.无效指针 第一步:关闭VS 第二部:删除%LocalAppData%\Microsoft\VisualStudio\14.0\ComponentModel ...
- 用apache-cxf生成webservice客户端的时候报错Parameter: shead already exists for method
版本apache-cxf-3.1.0 命令如下:wsdl2java -p com.wz.interfaces -d ./src -client ./ws/xxx.wsdl 报错如下: WSDLToJa ...
- js使用split函数按照多个字符对字符串进行分割的方法
这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js使用split函数按照多个 ...
- 爹地,我找到了!,15个极好的Linux find命令示例
爹地,我找到了!, 15个极好的Linux find命令示例 英文原文:Daddy, I found it!, 15 Awesome Linux Find Command Examples 标签: L ...
- linux下vim如何配置markdown插件
在vim中设置markdown语法高亮是一个不错的选择,但是在google中搜索到的很多都是比较老的设置方式,甚至vim插件下载页面都是一个旧的版本.这里总结下我的修改过程,以帮助像我一样纠结的人. ...
- Emoji表情符号录入MySQL数据库报错的解决方案(MySQL utf8与utf8mb4区别)
本文转自:http://blog.itpub.net/26230597/viewspace-1243233/前言:手机app应用评论的时候,恢复表情符号,提示失败. 1,查看tomcat后台日志,核心 ...
- linux压缩排除
tar -zcvf www/la.tar.gz --exclude=www/uploadfile --exclude=www/databases --exclude=www/web_logs www ...
- 关于Sublime text 的PHP编译环境配置的问题
前一段时间终于装上了传说中的代码编辑神器====>Sublime Text ,一打开便爱不释手,于是在网上找PHP的配置方案和插件,所有的一切都搞定了,可就是编译的时候没有显示,也没有提示,熬了 ...
- MySQL事物控制
有时候我们需要保证事物的各个步骤都执行成功的前提下才能让每一步骤的事物执行,此时就需要事物控制. 事物控制用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败 ...