在NHibernate与实体框架之间做出决定?

时间:2010-07-20 01:20:13

标签: nhibernate entity-framework orm

NHibernate和Entity Framework 4.0有哪些主要优点和缺点?

(在标记我的问题时,我注意到了比EF更多的NHibernate标签.NMibernate更受欢迎吗?)

3 个答案:

答案 0 :(得分:21)

我对EF(一些博客文章和教程)的经验非常有限,但对NHibernate有丰富的经验。

微软一直支持OpenSource运动,而NHibernate的情况绝对如此。当EF 1.0首次发布时,它缺乏对POCO支持和持久性无知等关键功能的支持,它要求您的实体类从EF扩展基本实体类,因此您的实体类不会与EF完全分离。这会影响可维护性和单元可测试性,以及在需要时切换ORM提供程序的能力。

另一方面,NHibernate允许您将实体与NHibernate本身完全分离。 EF 4.0在这方面已经有所提升,它的Code First Development方法(recently announce by Scott Guthrie)是朝着正确方向迈出的一步。

NHibernate本身具有一些非常强大的映射功能,例如继承映射,组件类的映射(认为Customer实体上的Address对象),单向实体关联映射。它允许您充分利用域模型中面向对象编程(封装,多态,继承等)的强大功能,将您的实体类视为封装行为,而不仅仅是数据容器。如果您希望根据Domain Driven Design的原则构建域模型,那么NHibernate非常适合这一点。我不能直接在EF 4.0上就这些问题说话,只能从我听到其他尝试使用EF 4.0的NHibernate用户那里得知,但EF 4.0在这些领域仍然落后,但它正在取得进展。

答案 1 :(得分:11)

我说实体框架来自微软既是优势也是劣势。您可以从与.NET本身相同的源代码获得框架。坏消息是微软经常废弃自己的代码库而不考虑向后兼容性。

NHibernate并非来自微软,除了Hibernate和NHibernate的开发人员所说的代码之外别无他法。好消息是他们一般都注意向后兼容性。有一个庞大的用户群,因为Hibernate已经存在了一段时间。

我最喜欢Spring的一个特点就是他们不会像你这样做出这样的决定。 Spring有自己的JDBC功能,但它支持Hibernate,TopLink,JDO,iBatis和JPA。如果您决定采用其他方式(例如NoSQL),您也可以自由注入自己的类。为什么您的选择应该由框架选择决定?这是非常保姆:“我们是微软;我们比你更了解什么对你最好。”

答案 2 :(得分:3)

作为一个一直使用NHibernate和Entity Framework一起工作并继续支持代码库的人,我遇到了这个老问题和一些过时的答案,并认为我会发布摘要更新。总结,因为您可以写一本书来详细比较两者。

截至2019年末,这两种工具都很不错,对于大多数想使用ORM的人来说,这两种工具都将做得很好。

2017年,我将新代码的团队/标准用途从NHibernate转移到了Entity Framework。

为什么我们从NHibernate开始? 当时(2013年),EF是相当新的功能,缺少功能,我觉得微软需要证明它们致力于该技术。现在已经解决了这两个问题。多年来,NHibernate对LINQ和Fluent配置的支持令人失望(我们仍然使用XML映射)。这些问题现在都已经解决了。

那为什么要转到实体框架? 我认为是时候转向实体框架了,因为我们正在转向.NET Core,并且它已经成熟到可以被视为.NET的核心部分的程度。因此,它会随着.NET中新功能的更新而更新。已准备好使用.NET Core(缺少一些功能,但现在还不错),良好的LINQ支持,默认的Fluent配置,与ASP.NET Core很好地集成,与新的日志记录和DI框架集成以及我们需要的所有功能。我仍然认为这是正确的选择。

选择什么? 我的建议是:如果您是熟悉Hibernate或移植使用Hibernate的Java代码的Java开发人员,则几乎没有理由转向EF,如果需要,您可以稍后再迁移。如果您一直使用.NET,我认为EF是明智的选择,尽管在某些情况下NHibernate会更好。

ORM的常见用法是与底层数据库隔离:SQL Server,MySQL,Oracle等:如今,EF声称比NHibernate支持更多的RDBMS,因此EF的另一个问题。

作为具有悠久历史(来自Java生态系统)的较旧产品,NHibernate确实具有EF中不可用的选项和功能:HQL(休眠查询语言,一种自定义查询语言),支持范围更广ORM方法,广泛的配置以及其他选项和可用工具。但是,我没有错过这些,我喜欢最新版本的EF的精简感觉。它满足了我的需求,而且没有任何遗产。