Entity Framework Core 批处理语句

在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<Category> 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] = @p0WHERE [CategoryID] = @p1;SELECT @@ROWCOUNT;UPDATE [Categories] SET [CategoryName] = @p2WHERE [CategoryID] = @p3;SELECT @@ROWCOUNT;UPDATE [Categories] SET [CategoryName] = @p4WHERE [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] = @p1WHERE [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'

正如您所看到的,有单个DELETEUPDATEINSERT语句,但被组合成一个单独的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那么强大,但随着时间的推移,它将会越来越成熟

相关文章: 

  • Entity Framework Core 生成跟踪列

  • 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

  • Entity Framework Core的贴心:优雅处理带默认值的数据库字段

  • Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

  • Entity Framework Core 软删除与查询过滤器

  • Entity Framework Core 命名约定

  • 全文索引 - Pomelo.EFCore.MySql

原文地址:http://www.cnblogs.com/tdfblog/p/batching-of-statement-in-entity-framework-core.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis和spring整合时这个报错,应该这样解决!

01问题描述今天在写mybatis和spring整合的时候&#xff0c;出现了个问题&#xff0c;其实也没有多难&#xff0c;就是自己没有仔细看&#xff0c;特此记录一下。报错问题如下&#xff1a;org.springframework.beans.factory.BeanCreationException: Error creating bean with n…

一个简单的例子,学习自定义注解和AOP

转载自 一个简单的例子&#xff0c;学习自定义注解和AOP 记得今年年初刚开始面试的时候&#xff0c;被问的最多的就是你知道Spring的两大核心嘛&#xff1f;那你说说什么是AOP&#xff0c;什么是IOC&#xff1f;我相信你可能也被问了很多次了。 1、到底是什么是AOP&#xff…

Xamarin for iOS 11(一) - 初尝ARKit

编者语&#xff1a;Xamarin 的兼容性是它最大的优点&#xff0c;对于iOS / Android 新的功能支持也是无缝的&#xff0c;做到100%兼容。Xamarin.ios for iOS 11.0的支持已经开始&#xff0c;大家可以在这里下载最新的Preview支持 (https://releases.xamarin.com/preview-xcode-…

挺不喜欢下雪的

你要储蓄你的可爱&#xff0c;眷顾你的善良&#xff0c;变得勇敢。当这个世界越来越坏时&#xff0c;只希望你能越来越好。——《南山南》昨天夜间&#xff0c;窗外雪花飘飘&#xff0c;朋友圈中到处都是晒下雪的照片&#xff0c;有的说是“这是2020年的第一场雪”&#xff0c;…

是什么使你留在你的公司

一个故事 之前离职的一个同事&#xff0c;是典型的技术型人才&#xff0c;前段时间跟他一起吃饭&#xff0c;得知他工作状况不是很理想&#xff08;他在创业型团队&#xff0c;工作强度非常大&#xff0c;且做出来的东西得不到应有的认可&#xff0c;公司给他的报酬也不是很高…

有些事,父母一定不能依着孩子!

今天的文章&#xff0c;可能有的人不太喜欢。在我教学这么些年以来&#xff0c;这个问题在今年出现的最多——父母总是站在孩子的角度&#xff0c;不管什么事都是依着孩子&#xff1b;如果此事对孩子好也就罢辽&#xff0c;但是明明对孩子没有一点好处&#xff0c;还要和孩子一…

“看起来你每天都要做好多事,你有时间吗?”

“我看你每天要干的事好多啊,你有那么多时间吗?” “有啊,早起会儿,晚睡会儿,时间就出来了” 我每天确实是要做好多事。 01 我是一个喜欢规律生活的人,通常会将自己的一天划分为好多块,每一块时间安排的事都不一样,不太喜欢别人打乱我的生活规律,也不知道这是好事还是…

Sentinel限流保护

自定义限流错误页

浅谈 EF CORE 迁移和实例化的几种方式

出于学习和测试的简单需要&#xff0c;使用 Console 来作为 EF CORE 的承载程序是最合适不过的。今天笔者就将平时的几种使用方式总结成文&#xff0c;以供参考&#xff0c;同时也是给本人一个温故知新的机会。因为没有一个完整的脉络&#xff0c;所以也只是想起什么写点什么&a…

Redis 高可用特性之 “持久化” 详解

转载自 Redis 高可用特性之 “持久化” 详解 在之前的文章中&#xff0c;介绍了《Redis的内存模型》&#xff0c;从这篇文章开始&#xff0c;将依次介绍 Redis 高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了 Redis 高…

这本书强烈推荐看看!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】今天&#xff0c;给大家推荐一本书《计算机是怎样跑起来的》&#xff0c;作者&#xff1a;矢泽久雄。也不知道它是怎么进入我的书架的&#xff0c;由于最近一直在看理财类的书籍&#xff0c;所以以前加入…

基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级

1、前言 surging受到不少.net同学的青睐&#xff0c;也提了不少问题&#xff0c;提的最多的是什么时候集成API 网关&#xff0c;在这里回答大家最近已经开始着手研发&#xff0c;应该在1,2个月内会有个初版API网关&#xff0c;其它像Token身份验证&#xff0c;限流降级等功能完…

1 分钟教会你用 Spring Boot 发邮件

转载自 1 分钟教会你用 Spring Boot 发邮件 Spring Boot 提供了一个发送邮件的简单抽象&#xff0c;使用的是下面这个接口。 org.springframework.mail.javamail.JavaMailSender Spring Boot 提供了一个 starter&#xff0c;并能自动配置&#xff0c;下面来做个小例子&#xf…

小二,先来两桂花豆沙包!

“包子嘞&#xff0c;卖包子嘞&#xff0c;新出锅的大包子&#xff0c;走过路过千万不要错过呦~包子嘞……”某年某月某下午&#xff0c;百万包子铺进来一人&#xff0c;进来便招呼&#xff1a;“小二&#xff0c;包子怎么卖&#xff1f;”小二&#xff1a;“客官&#xff0c;你…

SQL Server 2017 RC1 现已实现 Linux 功能扩展

经过七个预览版本的迭代之后&#xff0c;Microsoft 宣告发布第一个 SQL Server 2017 候选版本。开发人员可以藉由该版本来探索一些扩展 SQL Server Linux 版能力的新改进。 在这些新改进中&#xff0c;首先是对 Linux 上SQL Server 的 Active Directory 身份验证的支持。使用 …

一百馒头一百僧,大僧三个更无争,小僧三人分一个大小和尚得几丁?

如题&#xff1a;一百馒头一百僧&#xff0c;大僧三个更无争&#xff0c;小僧三人分一个大小和尚得几丁&#xff1f; 要求使用java实现求得大僧小僧各有多少人&#xff1f; public class shdjshj {public static void main(String[] args) {for(int i 1;i<100;i){int j 1…