asp.net core系列 66 Dapper介紹--Micro-ORM
一.概述
目前對於.net的資料訪問ORM工具很多,EF和EF Core是一個重量級的框架。最近在搭建新的專案架構,來學習一下輕量級的資料訪問ORM工具Dapper。Dapper支援SQL Server,MySQL,Sqlite,SqlCE,Firebird等的高效能Micro-ORM(微ORM框架)。最新版本是1.60.16。
Dapper擴充套件了IDbConnection介面,例如實現一個查詢方法,Dapper定義的一個Query查詢方法如下:
public static IEnumerable<T> Query<T>(this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)
原生態ado.net的System.Data.SqlClient也實現了IDbConnection介面,可參考如下:
https://docs.microsoft.com/en-us/dotnet/api/system.data.idbconnection?redirectedfrom=MSDN&view=netframework-4.8
Dapper開源地址:https://github.com/StackExchange/Dapper
Dapper Nuget包: https://www.nuget.org/packages/Dapper/
Dapper的主要特徵包括:
(1) 支援強型別。如查詢 Query<T>
(2) 支援動態物件。在Dapper. Rainbow擴充套件包中有實現
(3) 使用Execute執行執行T-SQL指令碼塊,不返回結果。
(4) 批量執行SQL語句。
(5) “效能”是Dapper的一個亮點。官方列出了查詢(select)與其它的ORM工具效能的對比引數。
(6) 引數化查詢
(7) 列表支援
(8) 字面替換
(9) 對於查詢的緩衝與無緩衝,預設行為是緩衝將資料交給了後端List,獲得資料後,就釋放了任何資源(減少了資料庫共享鎖等)。對於大量查詢(比如:>100條),需要將緩衝行為關閉,避免佔用太多記憶體,設定buffered:false的Query方法。 “注意緩衝不是快取”。
dapper buffer/cache
(10) 實體中外來鍵關係表對映。
(11) 允許單個查詢請求,查詢多個表。如:select table1,select table2
(12) 支援程式中資料庫事務處理。
Dapper注意事項:
(1) Dapper快取用來儲存每個查詢的資訊,快取在ConcurrentDictionary
物件中,如果不使用引數的情況下動態生成sql字串,則可能會遇到記憶體問題。
(2) Dapper的簡潔性意味著ORM附帶的許多功能都被剝離了。它擔心95%的情況,併為您提供大多數時間所需的工具。它並不試圖解決所有問題。
二. Dapper原始碼包
2.1 Dapper.Contrib包
Dapper.Contrib
是包含許多用於CURD的
輔助方法,
Contrib的關鍵組成部分是它為您的實體提供跟蹤,以確定是否已進行更改。與EF一樣GET出來的實現,在Update方法時,僅更新已更改的屬性所需的SQL。Dapper.Contrib中的擴充套件方法的完整列表,可以看出方法都是強型別:
T Get<T>(id); IEnumerable<T> GetAll<T>(); int Insert<T>(T obj); int Insert<T>(Enumerable<T> list); bool Update<T>(T obj); bool Update<T>(Enumerable<T> list); bool Delete<T>(T obj); bool Delete<T>(Enumerable<T> list); bool DeleteAll<T>();
Dapper將自動使用名為“ id
”(不區分大小寫)的屬性作為Key 屬性(所以資料表中最好以ID名稱為主鍵), 如果實體不遵循此約定,請使用[Key]
或[ExplicitKey]
屬性修飾特定屬性。[Key]
應該用於資料庫生成的鍵(例如自動增量列),而[ExplicitKey]
應該用於程式碼中生成的顯式鍵值
public class User { [Key] int TheId { get; set; } string Name { get; set; } int Age { get; set; } }
Dapper.Contrib使用了一些可選屬性:[Table("Tablename")]
- 使用另一個表名而不是類的名稱,如下示例:
[Table ("emps")] public class Employee { public int Id { get; set; } public string Name { get; set; } }
[Write(true/false)]
- 這個屬性是(不)可寫的
[Computed]
- 此屬性已計算,不應作為更新的一部分
具體參考
https://github.com/StackExchange/Dapper/tree/master/Dapper.Contrib
2.2 Dapper.EntityFramework包
Dapper.EntityFramework和Dapper.EntityFramework.StrongName依賴了entityframework 6.1.3 的DbGeography類和Microsoft.SqlServer.Types的SqlGeography類, 從資料庫中讀取幾何和地理值時,我們需要明確指定SRID以將其保留在DbGeometry / DbGeography型別中。
2.3 Dapper. Rainbow包
Rainbow是一個Abstract類,可以將其用作Dapper類的基類,實現CURD的
方法,以Dynamic為主的動態型別用於插入、更新、以及查詢引數的實現,輸出返回強型別。Rainbow希望你的所有表都有一個名為“Id”的標識列,在Dapper原始碼解決方案下沒有Dapper. Rainbow元件的測試案例。
Contrib和Rainbow之間的主要區別在於:一個跟蹤您實體的變化,另一個不跟蹤:
(1) 如果希望能夠跟蹤實體中的更改,請使用Contrib。
(1) 當您想要使用更符合標準ADO.NET方法的內容時,請使用Rainbow。
2.4 Dapper.SqlBuilder包
Dapper.SqlBuilder元件,用於動態構建SQL查詢。
2.5 Dapper.StrongName與Dapper包
StrongName包下的所有類檔案都是來源於Dapper包中的類,支援SQL Server,MySQL,Sqlite,SqlCE,Firebird等的高效能Micro-ORM, 用於強名稱,使用SqlMapper來實現ADO.NET的輕量級物件對映器。
三.其它擴充套件包
3.1 Dapper. SimpleCRUD
SimpleCRUD是一個簡單CRUD助手,可以選擇更改資料庫方言。預設為Microsoft SQL Server,但可以更改為PostgreSQL或MySQL。放棄了.Net Core版本的SQLite支援(在新專案中實用)。
3.2 Dapper.Extensions.NetCore
Dapper是一個簡單的CRUD助手。在Nuget上還有其它Dapper.Extensions.xx的擴充套件包。
&n