前言 在以前的一篇文章中,為大家分享了《什麼是ORM?為什麼用ORM?淺析ORM的使用及利弊》。那麼,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper,Entity Framework(EF)還是ServiceStack.OrmLite?或者是你還有更好的ORM推 ...
前言
在以前的一篇文章中,為大家分享了《什麼是ORM?為什麼用ORM?淺析ORM的使用及利弊》。那麼,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper,Entity Framework(EF)還是ServiceStack.OrmLite?或者是你還有更好的ORM推薦呢? 如果有的話,不防也一起分享給大家。
.NET(C#)主流ORM總攬
今天這篇文章分享幾款收集的目前.NET(C#)中比較流行的ORM框架,比如(以下框架均為開源框架,托管於github上):
SqlSugar (國內)
Dos.ORM (國內)
Chloe (國內)
StackExchange/Dapper (國外)
NHibernate (國外)
ServiceStack/ServiceStack.OrmLite (國外)
linq2db (國外)
Massive (國外)
PetaPoco (國外)
SqlSugar
SqlSugar是國人開發者開發的一款基於.NET的ORM框架,是可以運行在.NET 4.+ & .NET CORE的高性能、輕量級 ORM框架,眾多.NET框架中最容易使用的資料庫訪問技術。
特點:
開源、免費
國內開發者開發、維護;
支持.NET Core;
支持主流資料庫,如:SQL Server,MySql,Oracle,Sqlite等;
維護更新及時
推薦等級:★★★★☆
PetaPoco
PetaPoco:輕量的POCO對象和資料庫映射的ORM框架。
特點:
開源、免費
推薦等級:★★★★☆
linq2db
linq2db也是一款快速、輕量、類型安全的POCO對象和資料庫映射的ORM框架。從構架上來說,linq2db是對比如:Dapper、PetaPoco這個的微ORM的進一步封裝,但它不像Entity Framework那樣笨重。它沒有實現狀態跟蹤,需要自己處理實體的狀態更改等。
推薦等級:★★★★☆
Dos.ORM
Dos.ORM(原Hxj.Data)於2009年發佈,2015年正式開源。在開發過程中參考了NBear與MySoft,吸取了他們的一些精華,加入新思想,同時參考EF的Lambda語法進行大量擴展。該組件已在數百個成熟項目中應用。官方網站:http://ITdos.com/Dos/ORM/Inde...
特點:
開源、免費
上手簡單,0學習成本。使用方便,按照sql書寫習慣編寫C#.NET代碼。功能強大
高性能,接近手寫Sql
體積小(不到150kb,僅一個dll)
完美支持Sql Server(2000至最新版),MySql,Oracle,Access,Sqlite等資料庫
支持大量Lambda表達式寫法,國產ORM支持度最高,開源中國ORM排行前三
不需要像NHibernate的XML配置,不需要像EF的各種資料庫連接驅動
遵循MIT開源協議,除不允許改名,其它隨意定製修改
推薦等級:★★★☆☆
ServiceStack.OrmLite
ServiceStack.OrmLite的目標是提供一種方便,無干擾,無配置的RDBMS無關類型的封裝,與SQL保持高度的契合,展現直觀的API,可以生成可預測的SQL。
ServiceStack.OrmLite的宗旨:Fast, Simple, Typed ORM for .NET
特點:
開源、收費(免費版只支持單個庫10張表)
推薦等級:★★★☆☆
Entity Framework (EF)
ADO.NET Entity Framework 是微軟以 ADO.NET 為基礎所發展出來的對象關係對應 (O/R Mapping) 解決方案。該框架曾經為.NET Framework的一部分,但version 6之後從.NET Framework分離出來。
推薦等級:★★★☆☆
NHibernate
NHibernate是一個面向.NET環境的對象/關係資料庫映射工具。對象/關係資料庫映射(object/relational mapping,ORM)這個術語表示一種技術,用來把對象模型表示的對象映射到基於SQL的關係模型數據結構中去。
特點:
開源、免費
批量寫入
批量讀/多重查詢特性(我理解是在說Future?)
批量的集合載入
帶有lazy="extra"的集合
集合過濾器和分頁集合
二級緩存(實際上NH的二級緩存貌似也很簡單?)
集成和擴展性
代碼自動生成,減少代碼和sql的開發量,使開發人員擺脫開sql,ado.net和事務,緩存等底層
推薦等級:★★★☆☆
Massive
Massive:小巧,動態的微ORM框架。
推薦等級:★★★☆☆
什麼是ORM
ORM(Object-relational mapping),中文翻譯為對象關係映射,是一種為瞭解決面向對象與關係資料庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述對象和資料庫之間映射的元數據,將程式中的對象自動持久化到關係資料庫中。
為什麼用ORM
在程式開發中,資料庫保存的表,欄位與程式中的實體類之間是沒有關聯的,在實現持久化時就比較不方便。那麼,到底如何實現持久化呢?一種簡單的方案是採用硬編碼方式,為每一種可能的資料庫訪問操作提供單獨的方法。這種方案存在以下不足:
1.持久化層缺乏彈性。一旦出現業務需求的變更,就必須修改持久化層的介面
2.持久化層同時與域模型與關係資料庫模型綁定,不管域模型還是關係資料庫模型發生變化,毒藥修改持久化曾的相關程式代碼,增加了軟體的維護難度
ORM提供了實現持久化層的另一種模式,它採用映射元數據來描述對象關係的映射,使得ORM中間件能在任何一個應用的業務邏輯層和資料庫層之間充當橋梁
ORM的方法論基於三個核心原則:
簡單:以最基本的形式建模數據
傳達性:資料庫結構被任何人都能理解的語言文檔化
精確性:基於數據模型創建正確標準化了的結構
本文以C#編程語言為例,在傳統的數據讀取操作中,我們以Ado.net的方式對資料庫進行CRUD操作,使用的基本都是SQL硬編碼,比如有以下資料庫查詢操作:
String sql = "SELECT ... FROM persons WHERE id = 10";
DbCommand cmd = new DbCommand(connection, sql);
Result res = cmd.Execute();
String name = res[0]["FIRST_NAME"];
使用了ORM映射的C#實現的偽代碼:
Person p = repository.GetPerson(10);
String name = p.getFirstName();
上面的示例代碼表示我們可以從數據倉庫repository中獲取到一個實體對象,當然數據倉庫中可能包含其他的方法,你也可以定義自己的ORM實現,比如:
Person p = Person.Get(10);
通常,在處理ORM映射和數據倉庫時會暴露一些過濾或者查詢方法,允許客戶端對數據集進行進一步的篩選等操作,比如代碼演示從資料庫中查詢ID=10的用戶:
Person p = Person.Get(Person.Properties.Id == 10);
優/缺點
優點
與傳統的資料庫訪問技術相比,ORM有以下優點:
開發效率更高
數據訪問更抽象、輕便
支持面向對象封裝
缺點
降低程式的執行效率
思維固定化
從系統結構上來看,採用ORM的系統一般都是多層系統,系統的層次多了,效率就會降低。ORM是一種完全的面向對象的做法,而面向對象的做法也會對性能產生一定的影響。
在我們開發系統時,一般都有性能問題。性能問題主要產生在演算法不正確和與資料庫不正確的使用上。ORM所生成的代碼一般不太可能寫出很高效的演算法,在資料庫應用上更有可能會被誤用,主要體現在對持久對象的提取和和數據的加工處理上,如果用上了ORM,程式員很有可能將全部的數據提取到記憶體對象中,然後再進行過濾和加工處理,這樣就容易產生性能問題。
總結
作為一名編程人員,在ORM使用的觀念上會有不同,具體取捨需根據具體的項目和場景
作者:古蕭龍城IT青年
鏈接:https://www.jianshu.com/p/f308b4cd9670
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。