Nhibernate和 Entity Framework 4优缺点
關(guān)于NHibernate和Entity Framework 4.0各自優(yōu)點和功能,我們知道這二者都是基于.NET的對象/關(guān)系映射框架。EF 4相比EF1.0所作出的進(jìn)步之后,使得NHibernate成為更好的ORM解決方案的特性:
批量寫入——我們可以配置NHibernate,使其對數(shù)據(jù)庫進(jìn)行批量寫入,從而在你需要向數(shù)據(jù)庫中寫入多個指令的時候,NHibernate只需要與其進(jìn)行一次交互,而不需要在每個指令的執(zhí)行過程中都要訪問數(shù)據(jù)庫。
批量讀/多重查詢特性——NHibernate使你可以在與數(shù)據(jù)庫的一次交互過程中批量執(zhí)行多個查詢,而不需要在獨立的交互過程中執(zhí)行每個查詢。
批量的集合加載——當(dāng)你延遲加載集合的時候,NHibernate能夠找到其它相同類型而沒有載入的集合,然后只對數(shù)據(jù)庫進(jìn)行一次訪問,就把它們?nèi)枯d入。這種方法很好,因為這樣就可以避免處理SELECT N+1的問題。
帶有l(wèi)azy="extra"的集合——額外的延遲意味著NHibernate會適應(yīng)你可能在集合之上所要執(zhí)行的操作。這也意味著 blog.Posts.Count不會強(qiáng)行載入整個集合,而是創(chuàng)建“select count(*) from Posts where BlogId = 1”的指令,然后blog.Posts.Contains() 會類似地執(zhí)行單獨的查詢,而不需要付出將整個集合都載入到內(nèi)存中的代價。
集合過濾器和分頁集合——這讓你能夠在實體集合上定義附加的過濾器(包括分頁!),這意味著你可以很容易地對blog.Posts集合進(jìn)行分頁瀏覽,而不需要將所有的內(nèi)容都載入到內(nèi)存中。
二級緩存——管理緩存很復(fù)雜,之前我曾經(jīng)談過這為什么很重要,所以現(xiàn)在我將跳過它。
調(diào)整——當(dāng)你需要某些框架沒有提供的功能的時候,這就顯得很重要了。使用NHibernate,幾乎在所有的情況下,你都有擴(kuò)展點,但如果使用的是EF,你是完全并且絕對做不到的。
集成和擴(kuò)展性——NHibernate有大量擴(kuò)展項目,像NHibernate Search、NHibernate Validator,NHibernate Shards等等。而在EF中不僅不存在這樣的項目,而且大多數(shù)情況下也無法編寫這樣的項目,因為EF沒有任何可以使用的擴(kuò)展點。
Rahien也提到了使用EF 4的優(yōu)勢:
EF 4.0比當(dāng)前的NHibernate實現(xiàn)擁有更好的Linq提供程序。這也正是NHibernate正在積極改進(jìn)的地方,NH 3.0將會彌補這個問題。
EF屬于微軟。
NH的另一個主要優(yōu)勢在于它是開源軟件。這些年來我們可能多次需要給NH打補丁,以修正缺陷或者添加我所需要的功能。如果使用的是EF,我們是不能做這些的。
我想你可以很清楚地發(fā)現(xiàn),在這里只顯示了NHibernate的優(yōu)點。而根本沒有涉及到它的缺點——即便是你提到的關(guān)于LINQ提供程序的說法也和事實相去甚遠(yuǎn);另一個眾所周知的問題是EF支持變更跟蹤,而NH不支持,這在很多情況下會很大程度上影響性能(事實上,你應(yīng)該完全忘記NH中的特定情況 ——那是“有意地”)。
對單元測試和設(shè)計器的功能進(jìn)行了比較:
我想NHibernate最大的優(yōu)勢在于它能夠更好地支持單元測試。EF 4并非為測試而設(shè)計,因此很難基于EF 4為某些自定義的解決方案編寫單元測試。
另一方面,EF 4擁有很好的設(shè)計器(對于真實世界中的大型項目,這是你所需要的最重要的東西),還有基于該設(shè)計器的POCO T4模板。我想現(xiàn)在是你應(yīng)該開始考慮為NHibernate建立自己的設(shè)計器,而不是拒絕設(shè)計器和代碼生成器的時候了。如果社區(qū)需要NHibernate 的設(shè)計器,那么就給他們好的設(shè)計器。第三方的設(shè)計器和EF4的設(shè)計器相差甚遠(yuǎn),可能除了LLBGEN 3還好一些,但是它還沒有發(fā)布,而且不是免費的。
還有EF比NH好的地方就在于文檔、一致的示例以及在每次開發(fā)者大會上發(fā)表的大量的傳播演講,還有日夜不停發(fā)表的文章……NH應(yīng)該在這個問題上吸取教訓(xùn)(并且請不要找借口,它確實應(yīng)該在文檔方面吸取教訓(xùn)。如果你想要知道在那上面應(yīng)該吸取多大的教訓(xùn),那么請現(xiàn)在就去查看為_N_hibernate提供的 DDL SQL生產(chǎn)文檔,看它有多偉大,甚至能夠產(chǎn)生……java類。嗯?),同時還有很多可選擇的方法,那真的不是它所擁有的優(yōu)勢。
Felix建議采用組合式的解決方案:
不要相信某人所說的“OR/M是編碼的越南戰(zhàn)場”,NH是老兵,而EF是年輕的新兵。不幸的是微軟不支持開源,如果可以的話,事情會變得更容易:使用微軟提供的設(shè)計器和集成工具,使用NH作為OR/M,這會是高生產(chǎn)力的解決方案。
盡管Entity Framework擁有更好的LINQ提供程序、文檔,并且是由微軟所支持的,但NHibernate具有大量Entity Framework 4.0所不具備的特性,像批量讀/寫、“額外的”延遲、集合過濾器、調(diào)整等等。
轉(zhuǎn)載于:https://www.cnblogs.com/wangyanling1016/p/3665081.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Nhibernate和 Entity Framework 4优缺点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见的标记接口
- 下一篇: ssh中的相对路径与绝对路径的问题