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的擴展包。

 


免責聲明!

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



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