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

更多内容烦请关注我的博客《高先生小屋》

C# 数据操作系列 - 9. EF Core 完结篇的更多相关文章

  1. C# 数据操作系列 - 6 EF Core 配置映射关系

    0. 前言 在<C# 数据操作系列 - 5. EF Core 入门>篇中,我们简单的通过两个类演示了一下EF增删改查等功能.细心的小伙伴可能看了生成的DDL SQL 语句,在里面发现了些端 ...

  2. C# 数据操作系列 - 8. EF Core的增删改查

    0.前言 到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置. 这一篇,我带大家分享一下,我在工作中需要的EF Core的用法. 1 ...

  3. C# 数据操作系列 - 5. EF Core 入门

    0.前言 上一章简单介绍了一下ORM框架,并手写了一个类似ORM的工具类.这一章将介绍一个在C#世界里大名鼎鼎的ORM框架--Entity Framework的Core版. Entity Framew ...

  4. C# 数据操作系列 - 7. EF Core 导航属性配置

    在上一篇,大概介绍了Entity Framework Core关于关系映射的逻辑.在上一篇中留下了EF的外键映射没有说,也就是一对一,一对多,多对一,多对多的关系等.这一篇将为大家细细分析一下,如何设 ...

  5. C# 数据操作系列 - 16 SqlSugar 完结篇

    0. 前言 前一篇我们详细的介绍了SqlSugar的增删改查,那些已经满足我们在日常工程开发中的使用了.但是还有一点点在开发中并不常用,但是却非常有用的方法.接下来让我们一起来看看还有哪些有意思的内容 ...

  6. C# 数据操作系列 - 12 NHibernate的增删改查

    0. 前言 上一篇<C# 数据操作系列 - 11 NHibernate 配置和结构介绍> 介绍了Nhibernate里的配置内容.这一篇将带领大家了解一下如何使用NHIbernate.之前 ...

  7. C# 数据操作系列 - 15 SqlSugar 增删改查详解

    0. 前言 继上一篇,以及上上篇,我们对SqlSugar有了一个大概的认识,但是这并不完美,因为那些都是理论知识,无法描述我们工程开发中实际情况.而这一篇,将带领小伙伴们一起试着写一个能在工程中使用的 ...

  8. C# 数据操作系列 - 19 FreeSql 入坑介绍

    0. 前言 前几天FreeSql的作者向我推荐了FreeSql框架,想让我帮忙写个文章介绍一下.嗯,想不到我也能带个货了.哈哈,开个玩笑-看了下觉得设计的挺有意思的,所以就谢了这篇文章. 简单介绍一下 ...

  9. C# 数据操作系列 - 0. 序言

    0. 前言 在上一个系列中,我们初步浏览了一下C#的基础知识.这句话的意思就是C#基础知识系列完结了,撒花.当然,并不是因为C#已经讲完了.正是因为我们轻轻地叩开了那扇门,才能看到门后面那瑰丽的世界. ...

随机推荐

  1. liunx常用知识基本命令大全

    liunx基础命令使用 标签(空格分隔):liunx常用命令 网络配置 虚拟网卡的绝对路径 /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ...

  2. PHP把PNG图片转化为JPG时透明背景变黑色

    $type = exif_imagetype($srcimg); switch($type) { case 1: $simg = imagecreatefromgif($srcimg); break; ...

  3. php算--------法

    <?php //冒泡排序:两两交换数值,最小的值在最左边,就如最轻的气泡在最上边.对整列数两两交换一次//最小的数在最左边,每次都能得一个在剩下的数中的最小 的数//“冒”出来的数组成一个有序区 ...

  4. Linux安全实验缓冲区溢出

    缓冲区溢出实验: 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关 ...

  5. Inno Setup, Pascal 字符串带双引号如何写

    Windows 的路径中如果有空格,就需要用双引号括起来.只能填 ASCII-Code-Number (decimal),不能用一般的 escape 方法. # + path + # 查询这个表的第一 ...

  6. Enjoy the game

    这真的只是一道规律题 我找到规律了但是因为数据太大了我超时了 我们现在来看一下这道题 牛牛战队的三个队员在训练之余会自己口胡了一些题当做平时的益智游戏.有一天牛可乐想出了一个小游戏给另外两名队员玩,游 ...

  7. 播放声音 (c++) (windows)

    自己看自己看自己看自己看自己看自己看 在<windows.h>中 一:BOOL WINAPI MessageBeep (_in UINT uType ); 播放一个波形文件 (也就是wac ...

  8. vue项目中上拉加载和下拉刷新页面的实现

    功能:上拉加载,下拉刷新 使用方法: 自己创建一个.vue的文件(我自己是创建了一个PullToRefresh.vue的文件),将代码粘贴进去,具体的样式问题自己在该文件中调整. <templa ...

  9. Eclipse插件svn和TortoiseSvn版本对应关系

    2019独角兽企业重金招聘Python工程师标准>>> 先说一下今天碰到问题,自己在建svn仓库和导入,导出时因为版本不一致导致的错误. 因此一定要保证Eclipse中svn插件版本 ...

  10. 数学--组合数学--当C(n,m)中n固定m++的递推模板

    ll power(ll a, ll b, ll p) { ll ans = 1 % p; for (; b; b >>= 1) { if (b & 1) ans = ans * a ...