實體框架4與NHibernate

.net entity-framework nhibernate orm

很多人已經在網上討論過Entity Framework的第一個版本(也在stackoverflow上),很明顯,當我們已經擁有像NHibernate這樣的更好的替代品時,它不是一個好的選擇。但我找不到實體框架4和NHibernate的良好比較。我們可以說今天NHibernate是所有.NET ORM中的領導者,但是我們可以期待Entity Framework 4從這個位置取代NHibernate。我認為如果微軟真的在EF4中註入了非常好的功能,它可以給NHibernate帶來很好的競爭,因為它具有Visual Studio集成,更易於使用,並且在大多數商店中總是優先考慮MS產品。

一般承認的答案

EF4在“自我跟踪實體”中有關於n層開發的開箱即用的答案。沒人發布NHib的可比代碼。

NHib有很多未被提及作為EF4的一部分的功能。這些包括二級緩存集成。它還具有更大的繼承映射靈活性,與存儲過程/數據庫函數/自定義SQL /觸發器的更好集成,對公式屬性的支持等。 IMO它作為ORM基本上更加成熟。


熱門答案

更新:我從4.0版開始就沒有使用Entity Framework,所以我的回答可能已經過時了。我仍然在我的項目中使用NH或純ADO .NET。我甚至不想看看自4.0以來EF中的新功能,因為NH工作得很好。

當你使用兩者時,實際上很容易比較它們。 EF4有一些嚴重的限制,我可以說出我自己遇到的一些問題:

EF4問題:

  • 渴望加載和整形結果 :EF4 eager加載系統(包含(“路徑”))生成不正確的SQL,循環JOIN,對於多對多關係執行數千(非字面)時間慢,然後手寫SQL(它是實際上無法使用)。
  • Materializer無法實現關聯實體 :如果您認為通過提供自己的SQL查詢可以克服以前的問題,那麼您就錯了。 EF4無法從JOIN SQL查詢中實現(映射)關聯實體,它只能從一個表加載數據(所以如果你有Order.Product,SELECT * FROM命令LEFT JOIN產品將只初始化Order對象,Product將保持為null,認為在查詢中獲取所有必要的數據以初始化它)。這可以通過使用EFExtensions社區附加組件來克服,但您必須為此編寫的代碼非常難看(我試過)。
  • 自我跟踪實體 :許多人說自我跟踪實體對於N層開發來說很酷,包括這個主題的最佳答案。以為我甚至都沒試過,我可以說它們不是。每個輸入都可以偽造,你不能簡單地接受用戶發送給你的更改並將它們應用到數據庫,為什麼不給用戶直接數據基地訪問呢?你將不得不加載數據用戶的任何方式即將從DB更改,檢查它是否存在,不存在權限檢查等等。你不能信任用戶對他發送到服務器的實體的狀態,你還是會必須從數據庫加載這個實體並確定它的狀態和其他東西,所以這些信息是無用的,自我跟踪實體也是如此,除非你做一個私人信任的n層系統供內部使用,在這種情況下你可以給出簡單的數據庫訪問。 (多數民眾贊成我關於ST實體和N輪胎的想法,我在N-Tier中沒有經歷過,所以它可以改變,如果我在這裡誤解了一些東西,請評論它)

  • 記錄,事件,集成業務邏輯: EF4就像黑盒子,它做了一些事情,你不知道它做了什麼。只有一個事件OnSavingChanges,您可以在DB發生某些事情之前放置一些您需要運行的業務邏輯,如果您需要在事情發生之前對業務對象應用一些更改,您將不得不深入了解ObjectStateManager,這真的很難看,代碼可以變得巨大。例如,如果您使用Repository模式以及以乾淨對象方式對DB所做的更改通知的內容,那麼您將很難使用EF進行此操作。

  • 可擴展性:所有EF代碼都是私密的和內部的,如果你不喜歡某些東西(如果你認真對待EF使用你就不會喜歡),你決不會這麼簡單地改變它,事實上我確定從頭開始編寫自己的ORM(我做了)然後根據需要使EF工作更容易。作為示例,看一下EFExtensions源代碼,它基於擴展方法,以及不同的“黑客”使EF更加可用,代碼非常難看(並且這不是作者的錯,當EF中的所有內容都是私有的時候這是唯一的擴展它的方式)。

我可以繼續寫關於EF的不好的事情,對我來說,用20頁來處理它是多麼痛苦,也許我會。

NHibernate怎麼樣?這是完全不同的級別,就像比較PHP和C#,EF4就像Stone-age一樣,它就像EF在開發進程中落後於NHibernate落後10年,事實上它是,Hibernate始於2001年。如果你有空閒時間學習並打開Nhibernate,做到這一點。



Related

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