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),您也可以自由注入自己的类.为什么您的选择应该由框架选择决定?这是非常保姆:"我们是微软;我们比你更了解什么对你最好."