在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句。那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请求,它将在数据库的单次请求中批量执行多个语句。在这篇文章中,让我们看看它是如何工作的,并将结果与EF6进行比较。

EF Core将一次准备多个语句,然后在单次请求中执行它们,所以能提供了更好的性能和速度。让我们看看它是如何工作的。我们将借助SQL Server Profiler来捕获实际生成和执行的查询。

插入操作

首先,我们来看看插入语句的行为,以下代码在category表中添加3个记录:

using (var dataContext = new SampleDBContext()) {

dataContext.Categories.Add(new Category() {

CategoryID = 1,

CategoryName = "Clothing"

});

dataContext.Categories.Add(new Category() {

CategoryID = 2,

CategoryName = "Footwear"

});

dataContext.Categories.Add(new Category() {

CategoryID = 3,

CategoryName = "Accessories"

});

dataContext.SaveChanges();

}

当执行SaveChanges()时,以下是生成语句(通过 SQL Server Profiler 捕获):

exec sp_executesql N'SET NOCOUNT ON;

INSERT INTO [Categories] ([CategoryID], [CategoryName])

VALUES (@p0, @p1),

(@p2, @p3),

(@p4, @p5);

',N'@p0 int,@p1 nvarchar(4000),@p2 int,@p3 nvarchar(4000),@p4 int,@p5 nvarchar(4000)',@p0=1,@p1=N'Clothing',@p2=2,@p3=N'Footwear',@p4=3,@p5=N'Accessories'

您可以看到,没有3条单独的插入语句,它们被组合成一个语句,并且使用表值参数作为值。这里是SQL Server Profiler的屏幕截图:

如果我们在EF 6执行相同的代码,那么在SQL Server Profiler中会看到3个单独的插入语句:

这在性能和速度方面有很大的不同。如果这些查询针对的是云部署的数据库,那么它也将具有更高成本效益。现在,我们看看如果是更新语句会发生什么。

更新操作

以下代码将获得所有category记录列表,然后遍历它们,并为每个类别名称追加“-Test”文本,并保存。在这个时间点上,数据库中只有3条记录。

using (var dataContext = new SampleDBContext()) {

List lst = dataContext.Categories.ToList();

foreach (var item in lst) {

item.CategoryName = item.CategoryName + "-Test";

}

dataContext.SaveChanges();

}

并且在EF Core执行时,生成以下查询(通过 SQL Server Profiler 捕获)。

exec sp_executesql N'SET NOCOUNT ON;

UPDATE [Categories] SET [CategoryName] = @p0

WHERE [CategoryID] = @p1;

SELECT @@ROWCOUNT;

UPDATE [Categories] SET [CategoryName] = @p2

WHERE [CategoryID] = @p3;

SELECT @@ROWCOUNT;

UPDATE [Categories] SET [CategoryName] = @p4

WHERE [CategoryID] = @p5;

SELECT @@ROWCOUNT;

',N'@p1 int,@p0 nvarchar(4000),@p3 int,@p2 nvarchar(4000),@p5 int,@p4 nvarchar(4000)',@p1=1,@p0=N'Clothing-Test',@p3=2,@p2=N'Footwear-Test',@p5=3,@p4=N'Accessories-Test'

您可以看到,有3个更新语句,但都被组合成单条SQL语句。在EF 6执行相同的代码,SQL Server Profiler中将显示3个单独的更新语句:

使用EF 6,将有1 + N往返数据库,一次加载数据以及每行数据的修改;但是使用EF Core,保存操作是批量的,所以只有两次往返数据库。

插入、更新、删除混合操作

现在让我们尝试将3个操作混合在一起,看看EF Core和EF 6的行为。以下代码将更新现有记录,并插入2条新记录,最后删除一条记录。

using (var dataContext = new SampleDBContext())

{

Category cat = dataContext.Categories.First(c => c.CategoryID == 3);

cat.CategoryName = "Accessory";

dataContext.Categories.Add(new Category() { CategoryID = 4, CategoryName = "Fragnance" });

dataContext.Categories.Add(new Category() { CategoryID = 5, CategoryName = "Sports" });

Category catToDelete = dataContext.Categories.First(c => c.CategoryID == 2);

dataContext.Entry(catToDelete).State = EntityState.Deleted;

dataContext.SaveChanges();

}

当执行SaveChanges()时,生成以下查询(通过 SQL Server Profiler 捕获):

exec sp_executesql N'SET NOCOUNT ON;

DELETE FROM [Categories]

WHERE [CategoryID] = @p0;

SELECT @@ROWCOUNT;

UPDATE [Categories] SET [CategoryName] = @p1

WHERE [CategoryID] = @p2;

SELECT @@ROWCOUNT;

INSERT INTO [Categories] ([CategoryID], [CategoryName])

VALUES (@p3, @p4),

(@p5, @p6);

',N'@p0 int,@p2 int,@p1 nvarchar(4000),@p3 int,@p4 nvarchar(4000),@p5 int,@p6 nvarchar(4000)',@p0=2,@p2=3,@p1=N'Accessory',@p3=4,@p4=N'Fragnance',@p5=5,@p6=N'Sports'

正如您所看到的,有单个DELETE,UPDATE和INSERT语句,但被组合成一个单独的SQL语句。这里是SQL Server Profiler的屏幕截图:

在EF 6的中会发生什么?嗯,您猜对了。您可以通过 SQL Profiler 看到在数据库上执行的单个语句:

因此,使用EF Core进行批处理可以很大程度提高应用程序的速度和性能。等等,如果大型查询(如要插入500列和100行的表)会发生什么?它会失败吗?

批处理限制取决于您的数据库提供者。例如,SQL Server查询支持的参数最大数量为2100,因此,EF Core在此范围内可以漂亮地工作,并且当批处理限制超出数据库提供程序范围时,将分批查询。但是,在一个查询中批处理所有内容有时不一定是个好方式。有没有办法禁用批处理?

如何禁用批处理

是的,您可以禁用批处理。要禁用批处理,需要修改MaxBatchSize选项,您可以在OnConfiguring方法中进行配置。

protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)

{

string sConnString = @"Server=localhost;Database=EFSampleDB;Trusted_Connection=true;";

optionbuilder.UseSqlServer(sConnString , b => b.MaxBatchSize(1));

}

这里,将最大批量大小设置为1,这意味着批处理现在只能是单条查询。换句话说,它的行为类似于EF 6,要插入3个记录,将有3个单独的插入语句。使用此选项可以定义最大批量大小。

总结

批处理是期待已久的功能,并且社区也多次提出,现在EF Core已经支持,确实很棒,它可以提高应用程序的性能和速度。现在,EF Core本身还不像EF 6那么强大,但随着时间的推移,它将会越来越成熟。

efcore 批量_【EF Core】Entity Framework Core 批处理语句相关推荐

  1. 手把手引进门之 ASP.NET Core Entity Framework Core(官方教程翻译版 版本3.2.5)

    以下是手把手引进门教程,基于 ASP.NET Core, Entity Framework Core ,ABP 框架 创建Web 应用, PS: 自带自动的测试模块哦. 样例下载 (上 github  ...

  2. ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门

    ASP.NET Core 入门教程 8.ASP.NET Core + Entity Framework Core 数据访问入门 原文:ASP.NET Core 入门教程 8.ASP.NET Core ...

  3. 使用 ASP.NET Core, Entity Framework Core 和 ABP 创建N层Web应用 第二篇

    介绍 这是"使用 ASP.NET Core ,Entity Framework Core 和 ASP.NET Boilerplate 创建N层 Web 应用"系列文章的第二篇.以下 ...

  4. 尝试.Net Core—使用.Net Core + Entity FrameWork Core构建WebAPI(一)

    想尝试.Net Core很久了,一直没有时间,今天回家,抛开一切,先搭建一个.Net Core的Demo出来玩玩. 废话少说,咱直奔主题: 一.开发环境 VS2015 Update3 Microsof ...

  5. .net core Entity Framework Core Code First 框架 分层开发

    由于之前苦于无法把 Entityframework 跟Web层剥离.找了很久..找到了这个框架..分享给大家..  GitHub 地址:https://github.com/chsakell/dotn ...

  6. Entity Framework Core

    文章目录 一.Entity Framework Core 二.使用步骤 1.引入NuGet包 2.创建实体 3.实现实体配置类 5.默认约定都有那些 6.创建继承自DbContext的类 7.使用迁移 ...

  7. abp mysql .net core_ABP .Net Core Entity Framework迁移使用MySql数据库

    一.迁移说明 ABP模板项目Entity Framework Core默认使用的是Sql Server,也很容易将数据库迁移到MySQL,步骤如下. 二.迁移MySQL步骤 1. 下载项目 请到 ht ...

  8. Entity Framework Core 5中实现批量更新、删除

    本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新.删除数据的开发包,并且分析了其实现原理,并且与其他实现方案做了比较. 一.背景 随着微软全 ...

  9. .net core Entity Framework 与 EF Core

    重点讲 Entity Framework Core ! (一)Entity Framework 它是适用于.NET 的对象关系映射程序 (ORM),现在的EF6已经是久经沙场,并经历重重磨难,获得一致 ...

最新文章

  1. k8s系列---部署集群
  2. 华为SDSec分为几层
  3. DPDK加速I/O虚拟化
  4. 一款 0 门槛轻松易上手的数据可视化工具
  5. 有趣java_有趣的Java
  6. Vue 项目上线优化
  7. 1101 害死人不偿命的猜想 PAT
  8. (附源码)php小型网络舆情平台设计的开发毕业设计252324
  9. .net core | donet core IIS 文件路径问题
  10. 最新更新3个QQ空间认证申请入口
  11. ctf实验吧writeup
  12. Java下载excel模板
  13. 求生之路显示服务器列表指令,求生之路2指令大全 所有可用指令一览_游戏狗
  14. 动视暴雪宣布裁员约8%  780多名员工将被裁-千氪
  15. Effective C++ Third Edition 读书笔记 3
  16. 校园网服务器系统需求分析,校园网建设需求分析.doc
  17. 风控模型评估指标:KS、ROC、AUC、PSI代码逻辑
  18. 编写C#代码时,一个字符串太长如何换行
  19. ——苹果AppStore被拒理由大全
  20. 如何将ecology本地域名变成公网域名?

热门文章

  1. 【JVM】jvm jmap 使用
  2. 95-231-020-源码-Chain简介
  3. kafka报错:Error writing out kafka.log:type=Log,name=LogStartOffset,topic=xx EofException
  4. dubbo-admin的编译安装
  5. SparkSQL:SparkSQL CLI Application report for application_15_0022 (state: ACCEPTED)
  6. 集合Collection总览
  7. 编辑服务器上的文件,Sublime Text编辑远程Linux服务器上的文件
  8. Java关键字:final,static,this,super
  9. SQL Server 2008 R2 安装
  10. linux 设置交换文件格式,使用linux的mkswap命令建立和设置SWAP交换分区