QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

NHibernate 和 Entity Framework 4.0 优劣势争论

  • 2010-01-14
  • 本文字数:2359 字

    阅读完需:约 8 分钟

最近,Oren Eini(也被称为 Ayende Rahein)发表了一个帖子,从而引发了关于 NHibernate 和 Entity Framework 4.0 各自优点和功能的讨论,而这二者都是基于.NET 的对象 / 关系映射框架。InfoQ 对此讨论进行了深入的探究,以了解其中提到的观点。

Rahien 是 NHibernate 项目的成员之一,他对 NHibernate 和 Entity Framework 4(EF)做了简要的比较。在称赞 EF 4 相比 EF1.0 所作出的进步之后,Rahien 列举了他认为使得 NHibernate 成为更好的 ORM 解决方案的特性:

  • 批量写入——我们可以配置 NHibernate,使其对数据库进行批量写入,从而在你需要向数据库中写入多个指令的时候,NHibernate 只需要与其进行一次交互,而不需要在每个指令的执行过程中都要访问数据库。
  • 批量读 / 多重查询特性——NHibernate 使你可以在与数据库的一次交互过程中批量执行多个查询,而不需要在独立的交互过程中执行每个查询。
  • 批量的集合加载——当你延迟加载集合的时候,NHibernate 能够找到其它相同类型而没有载入的集合,然后只对数据库进行一次访问,就把它们全部载入。这种方法很好,因为这样就可以避免处理 SELECT N+1 的问题。
  • 带有 lazy="extra"的集合——额外的延迟意味着 NHibernate 会适应你可能在集合之上所要执行的操作。这也意味着 blog.Posts.Count 不会强行载入整个集合,而是创建“select count(*) from Posts where BlogId = 1”的指令,然后 blog.Posts.Contains() 会类似地执行单独的查询,而不需要付出将整个集合都载入到内存中的代价。
  • 集合过滤器和分页集合——这让你能够在实体集合上定义附加的过滤器(包括分页!),这意味着你可以很容易地对 blog.Posts 集合进行分页浏览,而不需要将所有的内容都载入到内存中。
  • 二级缓存——管理缓存很复杂,之前我曾经谈过这为什么很重要,所以现在我将跳过它。
  • 调整——当你需要某些框架没有提供的功能的时候,这就显得很重要了。使用 NHibernate,几乎在所有的情况下,你都有扩展点,但如果使用的是 EF,你是完全并且绝对做不到的。
  • 集成和扩展性——NHibernate 有大量扩展项目,像 NHibernate Search、NHibernate Validator,NHibernate Shards 等等。而在 EF 中不仅不存在这样的项目,而且大多数情况下也无法编写这样的项目,因为 EF 没有任何可以使用的扩展点。

Rahien 也提到了使用 EF 4 的优势:

  • EF 4.0 比当前的 NHibernate 实现拥有更好的 Linq 提供程序。这也正是 NHibernate 正在积极改进的地方,NH 3.0 将会弥补这个问题。
  • EF 属于微软。

作为 NHibernate 项目知名的贡献者,Rahien 的帖子引发了相当数量的正反两方面的响应。一位名叫 tobi 的读者对 NHibernate 错误消息的缺少提出了抱怨:

我只使用过 NHibernate 几个小时,对于我来说,手动创建域的类和映射(我使用了 FluentNHibernate )的过程需要太多手动的工作,并且错误信息不是很好。这是我认为相比而言 EF 4 比较好的地方。

Roy 对于错误信息和文档有着矛盾的心情:

EF 的一个额外的优势在于文档组织得更好,并且错误信息能够更清楚地描述问题。 尽管如此我还是更喜欢 NH,但是一旦你遇到问题,那么就需要浏览大量的博客来解决。相反,它的优势在于有很多人你可以请教。

Jimmy Bogard 赞赏 NHibernate 的缺陷修正过程,这使得它更有吸引力:

NH 的另一个主要优势在于它是开源软件。这些年来我多次需要给 NH 打补丁,以修正缺陷或者添加我所需要的功能。如果使用的是 EF,我是不能做这些的。

Alex Yakunin 参与了另一个 ORM 工具 ORMBattle.NET 测试套件的创建工作,他抱怨说:

我想你可以很清楚地发现,在这里只显示了 NHibernate 的优点。而根本没有涉及到它的缺点——即便是你提到的关于 LINQ 提供程序的说法也和事实相去甚远;另一个众所周知的问题是 EF 支持变更跟踪,而 NH 不支持,这在很多情况下会很大程度上影响性能(事实上,你应该完全忘记 NH 中的特定情况 ——那是“有意地”)。

Radenko Zec 对单元测试和设计器的功能进行了比较:

我想 NHibernate 最大的优势在于它能够更好地支持单元测试。EF 4 并非为测试而设计,因此很难基于 EF 4 为某些自定义的解决方案编写单元测试。 另一方面,EF 4 拥有很好的设计器(对于真实世界中的大型项目,这是你所需要的最重要的东西),还有基于该设计器的 POCO T4 模板。我想现在是你应该开始考虑为 NHibernate 建立自己的设计器,而不是拒绝设计器和代码生成器的时候了。如果社区需要 NHibernate 的设计器,那么就给他们好的设计器。第三方的设计器和 EF4 的设计器相差甚远,可能除了 LLBGEN 3 还好一些,但是它还没有发布,而且不是免费的。

Frans Bouma 是另一个 ORM 工具 LLBLGenPro 的作者,当说到文档时他指出 NHibernate 在该方面非常欠缺。

EF 比 NH 好的地方就在于文档、一致的示例以及在每次开发者大会上发表的大量的传播演讲,还有日夜不停发表的文章……NH 应该在这个问题上吸取教训(并且请不要找借口,它确实应该在文档方面吸取教训。如果你想要知道在那上面应该吸取多大的教训,那么请现在就去查看为 _N_hibernate 提供的 DDL SQL 生产文档,看它有多伟大,甚至能够产生……java 类。嗯?),同时还有很多可选择的方法,那真的不是它所拥有的优势。 Felix 建议采用组合式的解决方案:

不要相信某人所说的“OR/M 是编码的越南战场”,NH 是老兵,而 EF 是年轻的新兵。不幸的是微软不支持开源,如果可以的话,事情会变得更容易:使用微软提供的设计器和集成工具,使用 NH 作为 OR/M,这会是高生产力的解决方案。

讨论所呈现出来的一般共识是,尽管 Entity Framework 拥有更好的 LINQ 提供程序、文档,并且是由微软所支持的,但 NHibernate 具有大量 Entity Framework 4.0 所不具备的特性,像批量读 / 写、“额外的”延迟、集合过滤器、调整等等。关于这个讨论你的看法如何呢?

查看英文原文: Debate: Comparing NHibernate and EF 4

2010-01-14 06:469018
用户头像

发布了 340 篇内容, 共 134.3 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

实用指南:手把手搭建坚若磐石的DevSecOps框架

SEAL安全

DevSecOps 12 月 PK 榜 DevSecOps框架 实用指南

贾斯特里尼&布鲁克斯,葡萄酒中的天花板

联营汇聚

区块链+物联网,如何解决农产品溯源之痛?

旺链科技

区块链 物联网 产业区块链 农产品 12 月 PK 榜

好酒要有好工艺,贾斯特里尼&布鲁克斯,用心酿造每一滴酒

联营汇聚

前端必会面试题总结

loveX001

JavaScript

如何使用Towify在微信小程序中配置输入必填报错?

Towify

小程序 微信小程序 无代码 无代码微信小程序

跨平台应用开发进阶(二十八) :资源加载速度优化解决方案

No Silver Bullet

跨平台 12月月更 资源加载优化

用javascript分类刷leetcode3.动态规划(图文视频讲解)

js2030code

JavaScript LeetCode

HummerRisk V0.7.0:支持京东云、webhook、PDF下载等

HummerCloud

云安全 云原生安全

一文梳理HTTP、TCP、Socket和WebSocket的区别和联系

No Silver Bullet

TCP 网络协议 HTTP websocket 12月月更

陈世佳酿贾斯特里尼&布鲁克斯,优质葡萄酒连储藏都有秘诀

联营汇聚

软件测试 | 测试开发 | 一文搞定 Postman 接口自动化测试

测吧(北京)科技有限公司

Java7提供的Fork/Join框架实现高并发程序,你会使用吗

华为云开发者联盟

高并发 开发 华为云 12 月 PK 榜

数据可视化图表系列解析——折线图

Data 探险实验室

数据分析 可视化 数据可视化 可视化数据 折线图与饼图

手把手教你一套完善且高效的k8s离线部署方案

京东科技开发者

Docker k8s ansible ulimit 云计算,

低碳机关先行,昆明引领分布式光伏新变革

极客天地

分布式注册服务中心etcd在云原生引擎中的实践

京东科技开发者

分布式 云原生 etcd 集群 go语言

【论文推荐】TDSC2022 安全补丁识别最新的方案E-SPI

华为云开发者联盟

后端 开发 华为云 12 月 PK 榜

分支路径图调度框架在 vivo 效果广告业务的落地实践

vivo互联网技术

图调度 效果广告 分支路径

如何实现移除控件?

Towify

编辑器 无代码 无代码微信小程序

从输入URL到渲染的完整过程

loveX001

JavaScript

从URL输入到页面展现到底发生什么?

loveX001

JavaScript

【观看直播有礼】第三届云原生实战峰会正式官宣启动

阿里巴巴云原生

阿里云 云原生 实战峰会

新项目为什么决定用 JDK 17了

古时的风筝

Java JVM jdk17

先到先学!阿里新产Spring全家桶核心笔记,底层源码+应用全覆盖

程序员小毕

spring 源码 后端 架构师 java面试

前端工程师leetcode算法面试必备-二分搜索算法(上)

js2030code

JavaScript LeetCode

跨平台应用开发进阶(二十九) :uni-app 实现Android原生APP-云打包集成神策详细教程

No Silver Bullet

uni-app android 跨平台应用 云打包 12月月更

前端刷完这12道滑动窗口,就可以出山面试了

js2030code

JavaScript LeetCode

前端关于面试你可能需要收集的面试题

loveX001

JavaScript

vivo 推荐业务 x DeepRec:全链路优化实践

阿里云大数据AI技术

人工智能 gpu 推荐引擎 12 月 PK 榜

NHibernate和Entity Framework 4.0优劣势争论_.NET_Abel Avram_InfoQ精选文章