EF、Dapper、NHibernate等ORM框架的比較及優缺點

什麼是ORM?php

ORM的全稱是Object Relational Mapping,即對象關係映射。它的實現思想就是將關係數據庫中表的數據映射成爲對象,以對象的形式展示,這樣開發人員就能夠把對數據庫的操做轉化爲對這些對象的操做。所以它的目的是爲了方便開發人員以面向對象的思想來實現對數據庫的操做。java

ORM實現原理git

對象到數據庫的映射; 對象與數據庫數據的互相轉換;程序員


重量級ORM,github

以EntityFramework、NHibernate爲表明sql

優勢
面向對象方式訪問數據庫,擺脫SQL 可移植性強,支持全部流行的數據庫 面向接口的設計,可擴充性強 對事務、緩存(一級緩存)有良好的封裝及配置
缺點
比較複雜,學習曲線大;
處理對象關聯很容易出錯;
不適合統計查詢系統;
對於多表連查,複雜的sql實現比較複雜,並且有可能須要藉助其餘方案;
自動生成的sql查詢執行效率低;
對於大數據量、高負載場景須要慎重考慮;
實現良好的二級緩存很困難,而且只能定製;

輕量級ORM數據庫

以dapper爲表明,而且是半自動的。也就是說實體類都要本身寫,Dapper至關於Java裏的Mybatis。設計模式

優勢:緩存

一、開源、輕量、小巧(單文件,代碼就一個SqlMapper.cs文件,編譯後就40K的一個很小的Dll.)、上手容易。支持poco及動態類型,縮寫詞:POCO's (plain old CLR objects)。安全

二、支持的數據庫還蠻多的, Mysql,SqlLite,Sqlserver,Oracle等一系列的數據庫。

三、執行效率高,Dapper的速度接近與IDataReader,取列表的數據超過了DataTable。Dapper原理經過Emit反射IDataReader的序列隊列,來快速的獲得和產生對象。

使用poco時,屬性與數據庫表的映射沒法靈活配置,難以實現Repository模式

 

EF相對於ado.net 的優勢

1)開發效率高,Entity Framework的優點就是擁有更好的LINQ提供程序、文檔,而且是由微軟所支持的,用EntityFramework就是開發速度快(固然,那是在會linq的基礎上),智能感知(也是linq支持的結果),經過實體、關係型數據庫表之間的映射,使開發人員能夠經過操做表實體而間接的操做數據庫,大大的減小了代碼量。不用定義實體類那些東西了。直接與數據庫中模型結合起來了,開發人員徹底能夠根據面向對象的思惟進行軟件的開發。
2)可使用三種設計模式中的ModelFirst來設計數據庫,並且比較直觀
3)能夠跨數據庫,只須要在配置文件中修改鏈接字符串
4)與vs結合的比較好

EF的缺點
EF的Context上下文不是線程安全的,你不該該在整個Service上使用一個Context上下文。 

EF的性能表現不太好,它的性能不如ADO,開發沒法控制SQL語句的生成;頻繁插入操做(Insert)不適用, EF不支持大數據Bulk 插入

可維護性差,EF產生查詢,他們是難以維護的,它並不能很好地支持映射到不規範的表;它的概念模型,關係模型等所有都放在一個edmx文件裏面,過於龐大,並不利於修改

 

NHibernate優勢和缺點:

NHibernate優勢:
1.徹底的ORM框架。
NHibernate對數據庫結構提供了較爲完整的封裝,它將數據庫模式映射爲較徹底的對象模型,支持封裝,繼續機制,功能較強大,比通常的ORM靈活性高。
開發人員能夠徹底按照對象模型操縱數據庫。
2.代碼自動生成,減小代碼和sql的開發量,使開發人員擺脫開sql,ado.net和事務,緩存等底層。
NHibernate的O/R Mapping實現了PO 和數據庫表之間的映射,以及SQL 的自動生成和執行。程序員往 往只需定義好了PO 到數據庫表的映射關係,便可經過NHibernate提供的方法完成持久層操做。程序員甚至不須要對SQL 的熟練把握, NHibernate 會根據制定的存儲邏輯,自動生成對應的SQL 並調用ADO.NET接口加以執行。NHibernate有工具能夠直接根據數據庫模式生成po類,或者經過在代碼中添加Attribute屬性自動生成 配置文件。
這些都減小了開發工做量。
3.較好的文檔支持。
NHibernate的代碼可讀性和文檔都比較好。

 缺點:
1.較複雜,學習曲線大。
2.對數據庫模式有較高的要求。NHibernate須要數據庫有良好的設計和比較完善的約束。
3.不適合統計查詢系統。對於多表連查,複雜的sql實現比較複雜,並且有可能須要藉助其餘方案。
4.須要一些xml配置。

 

目前.NET(C#)中比較流行的ORM框架,好比(如下框架均爲開源框架,託管於github上):

ORM框架1.NHibernate 一個傳統的ORM,移植於java的Hibernate,3.0後發展迅速,提供FluentMap和FluentConfig,支持Linq,支持HQL和NativeSQL,支持一級緩存和二級緩存,豐富的ID生成策略,更多的攔截事件暴露,支持常見的全部數據庫,缺點就是配置選項有點多,初學者無處下手2.EntityFramework 微軟官方出的ORM,配置簡單,比NH更好的Linq支持,工具支持和較低的學習門檻,命名約定配置,支持CodeFirst DbMigration(在開發時,不能用在生產環境中),缺點就是不支持批量操做(第三方庫EntityFramework.Extension擴展了這一點,還作了緩存),無原生的二級緩存,,單調的ID生成方式,不支持多數據庫(不少數據庫如MySql都對EF提供了支持,可是bug多多,有穩定的商業庫能夠選擇),還有單一的配置方式(當你想從程序集動態加載model到DbContext中時,你就會知道就多捉雞)3.Dapper StackOverflow開源的一個MiniOrm,性能和原生ado.net相近,0配置,強類型支持.缺點一樣是有小bug,較弱的LINQ支持(只找到一個MSSQL的linq插件)有兩個關於Dapper的擴展,一個叫Dapper.Extension,一個叫Dapper.Rainbow.Mysql.這兩個擴展可能更接近傳統意義上的ORM4.ServiceStack.OrmLite 另一個MiniORM,性能僅次於Dapper,支持大部分的數據庫,比Dapper豐富的多的API和更好的強類型lambda表達式查詢條件支持,映射0配置,也支持以Attribute配置,支持表的建立和刪除

相關文章
相關標籤/搜索