BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

比较NHibernate和Entity Framework

| 作者 Jonathan Allen 关注 530 他的粉丝 ,译者 侯伯薇 关注 0 他的粉丝 发布于 2012年6月18日. 估计阅读时间: 6 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

葡萄牙的一位开发者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只有两种基于事件的扩展点:ObjectMaterializedSavingChanges。“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

我们应该发现两个项目都很活跃,经常会有定期的改进。所以,如果二者都能够满足你的最小需求,那么考虑就更多集中在程序库的设计模式和哲学上,而不是在特性列表上。

查看英文原文:Comparing NHibernate and Entity Framework

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

既然EF是实体框架,那么NH是不是应该叫N休眠? by monser corp

或者N冬眠

Re: 既然EF是实体框架,那么NH是不是应该叫N休眠? by net chtg

EF翻译了很别扭

作者没有考虑nhibernate 的生态环境 by 贾 伟

nhibernate的生态环境其实远远好于EF, 比如配合Castle,Spring.net, 在WEB平台轻松地实现事务控制。一个请求一个Connection。

Re: 既然EF是实体框架,那么NH是不是应该叫N休眠? by 侯 伯薇

感谢你的意见,还是不翻译的好,:)

没有完整的翻译 by 程 飞年

没有进行完整的翻译,既然是Share, 希望能看到完整的翻译, 英文的写的不错.

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

5 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT