决定之间的NHibernate与entity framework?

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

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

我在EF(几篇博客文章和教程)方面的经验非常有限,但对NHibernate有很多经验。

微软始终坚持开源运动,而NHibernate绝对是这种情况。 当EF 1.0第一次发布时,它缺less对POCO支持和持久性无知等关键特性的支持,它需要你的实体类从EF扩展一个基本实体类,所以你的实体类没有完全与EF解耦。 这影响了可维护性和单元可testing性,以及在需要时切换ORM提供者的能力。

NHibernate另一方面允许你完全解耦你的实体从NHibernate本身。 EF 4.0在这方面已经有所起色,它是Code First Development方法( 最近由Scott Guthrie发布 )是朝着正确方向迈出的一步。

NHibernate本身具有一些非常强大的映射function,比如inheritance映射,组件类映射(认为客户实体上的地址对象),单向实体关联映射。 它可以让你充分利用面向对象编程(Encapsulation,Polymorphism,Inheritance等)在你的领域模型中的力量,把你的实体类视为封装行为而不仅仅是数据容器。 如果你渴望按照领域驱动devise的原则构build你的领域模型,那么NHibernate非常适合这一点。 我不能直接在EF 4.0上讲这些问题,只能从其他使用EF 4.0的NHibernate用户那里听到,但EF 4.0在这些领域仍然滞后,但是正在逐渐取得进展。

我要说的是Entity Framework来自微软的事实既是优势也是劣势。 你正在从.NET本身获得一个来自同一个源的框架。 坏消息是,微软往往废弃自己的代码库,而不考虑向后兼容性。

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

我最喜欢Spring的一个特点是他们不会像这样离开你。 Spring有它自己的JDBCfunction,但它支持Hibernate,TopLink,JDO,iBatis和JPA。 如果您决定采用其他方式(例如NoSQL),您也可以自由注入自己的类。 为什么你的select是由框架select决定的? 这是非常保姆的:“我们是微软,我们知道什么比你更适合你。”