C# 數據操作系列 - 18 讓Dapper更強的插件

来源:https://www.cnblogs.com/c7jie/archive/2020/05/28/12980416.html
-Advertisement-
Play Games

0. 前言 在前一篇中我們講到了Dapper的應用,但是給我們的感覺Dapper不像個ORM更像一個IDbConnection的擴展。是的,沒錯。在實際開發中我們經常用Dapper作為對EF Core的補充。當然了Dapper並不僅僅只有這些,就讓我們通過這一篇文章去讓Dapper更像一個ORM吧。 ...


0. 前言

在前一篇中我們講到了Dapper的應用,但是給我們的感覺Dapper不像個ORM更像一個IDbConnection的擴展。是的,沒錯。在實際開發中我們經常用Dapper作為對EF Core的補充。當然了Dapper並不僅僅只有這些,就讓我們通過這一篇文章去讓Dapper更像一個ORM吧。

1. Dapper Contrib

Dapper Contrib 擴展了Dapper對於實體類的CRUD方法:

安裝方法:

命令行:

dotnet add package Dapper.Contrib

NuGet:

Install-Package Dapper.Contrib

使用:

using Dapper.Contrib.Extensions;

這個是一個使得Dapper功能更強大的擴展包,因為支持了CRUD,所以需要對實體類添加配置,該擴展包使用Attribute作為依據進行相關映射配置:

[Table("Model")]
public class Model
{
    [Key]
    [ExplicitKey]
    public int Id{get;set;}
    [Computed]
    public int Count {get;set;}
    [Write]
    public String Name{get;set;}
}

這是所有的配置,Table用來聲明是一個表,必須指定表名,Key表示該屬性是資料庫主鍵,ExplicitKey表示這個屬性是資料庫中顯示設置的主鍵,Computed表示該欄位是一個計算欄位,Write表示該欄位可以設置值進去。需要註意的是: Key和ExplicitKey這兩個不能同時標註在一個屬性上。

那麼接下來,我們看看它擴展了哪些方法:

插入單個對象:

public static long Insert<T>(this IDbConnection connection, T entityToInsert, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

其中 transcation表示事務,如果指定事務,數據的提交將由事務控制,該方法會返回插入對象的主鍵(如果對象主鍵是數字類型)或者返回一個待插入列表中已插入的行數。

獲取單個對象:

public static T Get<T>(this IDbConnection connection, [Dynamic] dynamic id, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

通過傳入主鍵,獲取一個數據

獲取所有數據:

public static IEnumerable<T> GetAll<T>(this IDbConnection connection, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

更新數據:

Dapper Contrib 提供了一個用來更新的方法:

public static bool Update<T>(this IDbConnection connection, T entityToUpdate, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

這個方法比較有意思的是

var entity = connection.Get<Model>(1);
entity.Name = "測試1";
connection.Update(entity);

var models = connection.GetAll<Model>();
foreach(var m in models)
{
    Console.WriteLine(m);
    m.StringLength ++;
}
connection.Update(models.AsList());

都可以,並不會報錯。

不過需要註意的是,如果需要更新的實例沒有指定主鍵值(主減屬性沒有賦值),則不會有任何行發生更新。而且在更新的時候,會更新所有列,不會因為不賦值就不更新。

刪除方法有兩個:

public static bool Delete<T>(this IDbConnection connection, T entityToDelete, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
public static bool DeleteAll<T>(this IDbConnection connection, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

刪除也是傳入一個實體類,一樣也只是需要主鍵有值,如果沒有找到主鍵對應的數據,則不會有任何變化。Delete與Update一樣,如果傳入一個List集合也是可以的。

2. Dapper Transaction

這個包擴展了Dapper的事務處理能力。雖然是Dapper的擴展包,但是是給IConnection添加了一個擴展方法。使用示例如下:

dotnet add package Dapper.Transaction

老規矩,記得先把包加進來。

然後代碼是這樣的:

using Dapper.Transaction;
using(var connection = new SqliteConnection("Data Source=./demo.db"))
{
    connection.Open();
    var transcation = connection.BeginTransaction();
    // 編寫業務代碼
    transcation.Commit();
}

如果使用Dapper Transaction,需要先調用 connection.Open()來確保連接是開啟狀態。

transcation這個對象可以當做普通的DbTranscation對象,傳給Dapper的方法來使用,也可以當做一個開啟了事務的Dapper客戶端來使用。也就是說,Dapper對IDbConnection擴展的方法,在這個包對IDbTranscation也擴展了響應的方法:

image-20200527155732804

3. Dapper Plus

這個插件是Dapper上用來處理巨量數據的插件,但這是個收費版的插件,不過每個月都有一定的試用期限。想試試的可以下一下:

dotnet add package Z.Dapper.Plus

使用:

using Z.Dapper.Plus;

這個插件在使用之前需要先配置實體類與資料庫之間的映射關係:

DapperPlusManager.Entity<Customer>().Table("Customers");
DapperPlusManager.Entity<Supplier>().Table("Suppliers").Identity(x => x.SupplierID);

該插件支持四組大批量處理方式:

  • Bulk Insert
  • Bulk Update
  • Bulk Merge
  • Bulk Delete
// STEP MAPPING
DapperPlusManager.Entity<Supplier>().Table("Suppliers").Identity(x => x.SupplierID);
DapperPlusManager.Entity<Product>().Table("Products").Identity(x => x.ProductID);

// STEP BULKINSERT
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    connection.BulkInsert(suppliers).ThenForEach(x => x.Products.ForEach(y => y.SupplierID =  x.SupplierID)).ThenBulkInsert(x => x.Products);
}

// STEP BULKUPDATE
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    connection.BulkUpdate(suppliers, x => x.Products);
}

// STEP BULKMERGE
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    connection.BulkMerge(suppliers).ThenForEach(x => x.Products.ForEach(y => y.SupplierID =  x.SupplierID)).ThenBulkMerge(x => x.Products);
}

// STEP BULKDELETE
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    connection.BulkDelete(suppliers.SelectMany(x => x.Products)).BulkDelete(suppliers);
}

4. 總結

這些插件讓Dapper更強,也更具備一個完整的ORM的方法,當然實際開發中需要結合實際需求使用。可能並不是所有的都合適。

Dapper的內容就到此為止了。本來預計下一篇開始 asp.net core的內容,不過有個小伙伴推薦了FreeSql,我看了下感覺挺不錯的,就給小伙伴們介紹一下~這一個介紹完成之後,就進入了我期待已久的asp.net core系列了。

更多內容煩請關註我的博客《高先生小屋》

file


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 #include "stdio.h" 2 #include "time.h" 3 #include <windows.h> 4 5 // 6 // 7 // Title: C語言實現小人移動 V1.0 8 // Author: 鄒陽 9 // Date : 2020/05/28 10 // 11 ...
  • 首先在用戶表定義一個積分欄位; 然後創建一個等級表,主要欄位有等級名,上限積分和下限積分; 再根據用戶的行為進行積分累加; 最後根據判斷用戶積分在哪個等級範圍,從而得出用戶等級。 用戶表 CREATE TABLE `bbs`.`user`( `id` INT(10) UNSIGNED NOT NUL ...
  • Java多線程面試問題 1. 進程和線程之間有什麼不同? 一個進程是一個獨立(self contained)的運行環境,它可以被看作一個程式或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含了不同的類和程式的單一進程。線程可以被稱為輕量級進程。線程需要較少的資源來創建和駐留在進 ...
  • 使用場景:新頭像替換舊的頭像 步驟: 1. 讀取資料庫頭像的URL地址 2. 獲取URL地址的有效欄位 3. file文件路徑設置 4. 刪除圖片文件 Thinkphp 代碼如下: <?php public function delPic(){ //獲取用戶id $uid = input('uid' ...
  • Java這門語言的發展是很有意思的,它不像Python, Ruby 等完全是開源社區驅動,也不像C#,VB.NET主要由微軟操刀。它是一個以Oracle(之前是Sun)為主,各大巨頭一起參與,一起制定標準的一門語言。 想對Java添加一點特性, 得走JCP流程,巨頭們要審查,看看對自己是否有利,然後 ...
  • Blazor編譯後的文件是靜態文件,所以我們只需要一個支持靜態頁面的web server即可。 根據不同項目,會用不同的容器編排,本文已無網關的情況下為例,一步一步展示如何打包進docker 需求 HTTPS 既然無網關,直接面向互聯網,所以HTTPS顯得尤為重要 HTTP/2 TLS3.0 既然都 ...
  • C#編碼轉換主要使用了Encoding.Convert方法,它需要原編碼字元串的位元組數組作為參數,返回目標編碼的位元組數組。Encoding對象可以從字元串獲取位元組數組,又能夠從位元組數組還原字元串,因此可以將其組合用來轉碼。 ...
  • k8s 和 Docker容器技術,當前非常流行的技術. 讓人日狗的是, 這套技術棧對CN的donet 程式員不怎麼友好。娓娓道來,1. 好多鏡像都是需要梯子才能訪問; 2. window程式員天生對命令行操作陌生。3. 好多資料都是linux 等等..... 下麵我們來一起安裝部署下。 一, 安裝環 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...