葡萄牙的一位开发者Ricardo Peres最近发布了一篇文章,以看起来无偏见的形式对领先的两种.NET ORM:NHibernate和实体框架进行了比较。我们建议考虑使用这两种框架的人都应该读下他的文章,NHibernate和实体框架之间的区别,另外还将指出一些关键的区别。
从架构上看,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都太企业化,并且架构过于庞大;结果会与你想要的大相径庭)。”
实体框架遵循的是更加传统的.NET设计,其中所有一切都封装在单独的ObjectContext或者DbContext中。这让使用对象更加简单,但是缺点在于“类并没有因此是轻量级的,因为它有与 NHibernate类似的内容,并且一般不会看到这样的例子:实例可以缓存在字段中。”
对于映射,NHibernate和实体框架之间的关键区别在于,前者支持基于XML的映射文件,该文件可以独立部署。在理论上,这让你可以针对不同的数据库schema使用相同的对象模型,而不需要重新编译应用程序。但在实践中很少这么使用。
在很多方面古老一些的NHibernate要优于实体框架。Ricardo提供了更多细节,并简要地总结如下:
也有一些领域中,实体框架会比NHibernate,比方说:
还有某些领域,两种框架都可以做出改进,像批处理功能。当需要真正支持SQL的高级特性——像通用表表达式——的时候,两种ORM框架都无法支持SQL Alchemy。
我们应该发现两个项目都很活跃,经常会有定期的改进。所以,如果二者都能够满足你的最小需求,那么考虑就更多集中在程序库的设计模式和哲学上,而不是在特性列表上。
联系客服