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

0.前言

《EF Core》實際上已經能夠告一段落了,可是感受還有一點點意猶未盡。因此決定分享一下,我的在實際開發中使用EF Core的一些經驗和使用的擴展包。sql

圖片

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進行執行就行。app

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,可是底層來源於數據訪問接口。ide

簡單的實例:異步編程

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

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

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 系列了。

相關文章
相關標籤/搜索