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


什么是ORM?

ORM的全稱是Object Relational Mapping,即對象關系映射。它的實現思想就是將關系數據庫中表的數據映射成為對象,以對象的形式展現,這樣開發人員就可以把對數據庫的操作轉化為對這些對象的操作。因此它的目的是為了方便開發人員以面向對象的思想來實現對數據庫的操作。

ORM實現原理

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


重量級ORM,

以EntityFramework、NHibernate為代表

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

輕量級ORM

以dapper為代表,並且是半自動的。也就是說實體類都要自己寫,Dapper相當於Java里的Mybatis。

優點:

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

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

3、執行效率高,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.這兩個擴展可能更接近傳統意義上的ORM
4.ServiceStack.OrmLite 另外一個MiniORM,性能僅次於Dapper,支持大部分的數據庫,比Dapper豐富的多的API和更好的強類型lambda表達式查詢條件支持,映射0配置,也支持以Attribute配置,支持表的創建和刪除

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM