在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),您也可以自由注入自己的類。為什麼您的選擇應該由框架選擇決定?這是非常保姆:“我們是微軟;我們比你更了解什麼對你最好。”



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因