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

entity-framework nhibernate orm

NHibernate和Entity Framework 4.0的主要优点和缺点是什么?

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

一般承认的答案

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

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

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

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


热门答案

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

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

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因