C# 數據操作系列 - 9. EF Core 完結篇

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

0.前言 《EF Core》實際上已經可以告一段落了,但是感覺還有一點點意猶未盡。所以決定分享一下,個人在實際開發中使用EF Core的一些經驗和使用的擴展包。 1. EF Core的非同步操作 正如這小節題目所言,EF Core是支持非同步操作的,但實際可用集中在SaveChanges和非同步查詢這兩個 ...


0.前言

《EF Core》實際上已經可以告一段落了,但是感覺還有一點點意猶未盡。所以決定分享一下,個人在實際開發中使用EF Core的一些經驗和使用的擴展包。

1. EF Core的非同步操作

正如這小節題目所言,EF Core是支持非同步操作的,但實際可用集中在SaveChanges和非同步查詢這兩個方法上。

具體方法聲明如下:

public virtual System.Threading.Tasks.Task<int> SaveChangesAsync (System.Threading.CancellationToken cancellationToken = null);
public virtual System.Threading.Tasks.Task<TEntity> FindAsync<TEntity> (params object[] keyValues) where TEntity : class;
public virtual System.Threading.Tasks.Task<TEntity> FindAsync<TEntity> (object[] keyValues, System.Threading.CancellationToken cancellationToken) where TEntity : class;
public virtual System.Threading.Tasks.Task<object> FindAsync (Type entityType, params object[] keyValues);
public virtual System.Threading.Tasks.Task<object> FindAsync (Type entityType, object[] keyValues, System.Threading.CancellationToken cancellationToken);

這五個方法分別是SaveChanges的非同步版,和Find的非同步版。兩種方法都支持傳入一個取消令牌(這部分內容需要等後期的《C# 非同步編程系列》里介紹)。

返回一個Task,然後按照Task進行執行就行。

DbContext 也提供了Add/AddRange的非同步方法,但是這組方法的非同步版需要資料庫的支持,並不是一個通用的方法,所以就沒有提。

var context = new DefaultContext("Data Source=./blogging1.db");
var task1 = context.FindAsync<SingleModel>(1);
var result = task1.Result;
var task2 = context.SaveChangesAsync();

這兩個任務是創建一個熱啟動任務,也就是不用手動調用 Run方法。

回到數據查詢來,查詢的非同步支持方法組是來自於Linq,但是底層來源於數據訪問介面。

簡單的實例:

var task3 = context.Set<SingleModel>().Where(t => true).ToListAsync();

當獲取task3結果的時候,會強制等待任務完成執行。

2. using的另一種用法

我們知道using關鍵字通常用來引入命名空間,當然微軟引入了另外一種用法。對於EF Core的DbContext,框架推薦在用完之後將上下文銷毀。而我們每次使用必須都進行手動銷毀。

如果我們在使用try/catch/finally進行捕獲異常的時候,需要在finally里放資源釋放的代碼。如果資源得不到正確及時的釋放會出現更多的問題。

為了改善這種現狀,微軟便添加了using關鍵字的另外一種用法。

using (var context = new DefaultContext("Data Source=./blogging1.db"))
{
    // 使用 context
}

以上實例代碼中using的含義是聲明一個context作用於兩個大括弧之間,當兩個大括弧之間的代碼執行完成後,會自動調用context.Dispose()方法。

using關鍵字的機制不會因為中途返回而不執行 context.Dispose(),也不會因為中間被拋出異常不執行。using的使用並不局限於實現IDisposable介面的對象,其他的對象也可以使用。

3. EF Core的資料庫訪問插件

微軟為SQLite和SQL Server提供了預設的資料庫連接程式,其中 SQLite的是:

Microsoft.EntityFrameworkCore.Sqlite

SQL Server是:

Microsoft.EntityFrameworkCore.SqlServer

其他的常用資料庫都是由三方提供,以下是一些常見的連接程式包和資料庫名稱:

NuGet 程式包 支持的資料庫引擎 維護商/供應商
Npgsql.EntityFrameworkCore.PostgreSQL postgresql Npgsql 開發團隊
Pomelo.EntityFrameworkCore.MySql MySQL、MariaDB Pomelo Foundation 項目
Devart.Data.MySql.EFCore MySQL 5 及以上版本 DevArt
Devart.Data.Oracle.EFCore Oracle DB 9.2.0.4 及更高版本 DevArt
Devart.Data.PostgreSql.EFCore PostgreSQL 8.0 及以上版本 DevArt
Oracle.EntityFrameworkCore Oracle DB 11.2 及更高版本 Oracle

4. EF Core的配件

在EF 4的年代,EF本身不支持對批量數據的支持。後續慢慢增加了對數組的處理,包括增刪。

但是隨著時代的發展,數據量越來越大。所以僅僅是數組不能滿足實際需求了。

現在給大家推薦一個插件:

Z.EntityFramework.Plus.EFCore

這個插件可以擴展DbContext的功能,使其支持對查詢結果的操作:

var ctx = new DbContext();
var date = DateTime.Now.AddYears(-2);
ctx.Users.Where(x => x.LastLoginDate < date)
         .Delete();

// DELETE using a BatchSize
var date = DateTime.Now.AddYears(-2);
ctx.Users.Where(x => x.LastLoginDate < date)
         .Delete(x => x.BatchSize = 1000);

當然,還有更多的特點,以後在ASP.NET Core篇再為大家介紹。

5.後續

EF Core到目前為止已經結束了,下一篇將開始探索一下Nhibernate或者Dapper吧。OK,C#的數據訪問篇里的大頭基本完成了。

下一個系列,小伙伴們打算看什麼?預計是開始ASP.NET Core 系列了。

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

file


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

-Advertisement-
Play Games
更多相關文章
  • 時間格式我使用的一直都是 yyyy-MM-dd HH:mm:ss,然後某天,我改成了 yyyy/MM/dd HH:mm:ss,然後神奇的問題就來了。 ...
  • 近來有一個報名網站原來是內網訪問的,近期要放到外網訪問,但要求密碼不能明文傳輸。在網上參考了幾個帖子並整理出來: asp.net 前端JS RSA加密,後端c#解密 在分享源碼之前,先準備一些東西:1、下載一個js加密幫助文件,下載地址:https://passport.cnblogs.com/sc ...
  • SoundPlayer是為應用程式添加音頻功能最簡單、最輕量型的方法,但只能播放wav格式的語音。 百度線上語音合成可以合成wav格式的語音,保存為本地文件,SoundPlayer出錯,仔細看文檔發現百度的wav就是pcm 16k(3為mp3格式(預設); 4為pcm 16k;5為pcm 8k;6為 ...
  • .NET Core 3.1 跨域請求 (CORS) 在用ajax進行請求伺服器資源時如果協議+主機名+埠號 (如存在)相同則允許交互,否則會出現跨域問題,不能訪問和操作其他域下的資源。常用解決方式有在前端使用jsonp和在後端啟用CORS。 jsonp可以支持get請求,但不支持post請求。完美 ...
  • C#關於Excel文件轉TXT文本的實現 沒什麼可介紹的,但是要註意文件的地址別寫錯了,如下是具體實現代碼: private DataTable FileToDataTable(string fileName,string sheetName) { Monster m = new Monster() ...
  • C#實現建立Excel文件,填充數據後保存 直接代碼,相關註釋見下代碼: static void Main(string[] args) { string filePath = @"F:\Test\Excel\"; CreateExcel(filePath); } public static voi ...
  • 一.docker的安裝與加速器配置 安裝docker:yum install docker (預設安裝路徑/var/lib/docker) 啟動docker服務:systemctl start docker.service (sudo service docker start) 配置開機啟動並驗證: ...
  • ASP.NET Core允許我們指定註冊服務的生存期.服務實例將根據指定的生存時間自動處理.因此,我們無需擔心清理此依賴關係,他將由ASP.NET Core框架處理.有如下三種類型的生命周期. 關於依賴註入通俗易懂的內容大家可以看一下我上一篇文章 ".NET IoC模式依賴反轉(DIP)、控制反轉( ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...