entityframework三种使用方式(entityframeworkcore教程)

技术Entity Framework Core 批处理语句是什么小编给大家分享一下Entity Framework Core 批处理语句是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这

边肖将与您分享什么是实体框架核心批处理语句。相信大部分人都不是很了解,所以分享这篇文章供大家参考。希望你看完这篇文章后有很多收获。我们一起来看看吧!

实体框架核心(EF Core)中有很多新功能,其中最受期待的功能之一就是批处理语句.那么批处理语句是什么呢?Batch语句意味着它不会为每个insert/update/delete语句发送单独的请求,而是在数据库的单个请求中分批执行多个语句。在本文中,让我们看看它是如何工作的,并将结果与EF6进行比较。

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

插入操作

首先,我们来看看插入语句的行为。下面的代码将三条记录添加到类别表中:

使用(vardataContext=newSampleDBContext()){ 0

dataContext。类别。添加(新类别()}

CategoryID=1,

类别名称='服装'

});

dataContext。类别。添加(新类别()}

CategoryID=2,

类别名称=“鞋类”

});

dataContext。类别。添加(新类别()}

CategoryID=3,

类别名称='附件'

});

dataContext。saveChanges();

}执行SaveChanges()时,以下是生成的语句(由SQL Server Profiler捕获):

execsp _ executesqlN ' setnocounton;INSERTINTO[categorid]([CategoryID],[CategoryName])VALUES(@p0,@p1)、(@p2,@p3)、(@p4,@ P5);n' @ P0int、@ P1 nvarchar (4000)、@ P2int、@ P3 nvarchar (4000)、@ P4int、@ P5 nvarchar (4000)'、@ P0=1、@ P1=n '衣饰'、@ P2=2、@ P3以下是SQL Server Profiler的截图:

Entity  Framework  Core  批处理语句是什么

如果我们在EF 6中执行相同的代码,我们将在SQL Server Profiler中看到三个独立的插入语句:

Entity  Framework  Core  批处理语句是什么

性能和速度差别很大。如果这些查询是针对部署在云端的数据库,也将更具成本效益。现在,让我们看看如果它是一个update语句会发生什么。

>

更新操作

以下代码将获得所有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个单独的更新语句:

Entity Framework Core 批处理语句是什么

使用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的屏幕截图:

Entity Framework Core 批处理语句是什么

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

Entity Framework Core 批处理语句是什么

因此,使用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个单独的插入语句。使用此选项可以定义最大批量大小。

以上是“Entity Framework Core 批处理语句是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/148266.html

(0)

相关推荐

  • moisten,Moisten是什么意思

    技术moisten,Moisten是什么意思moisten 英[mɔɪsn] 美[ˈmɔɪsən] vt.& vi. (使)变得潮湿moisten,变得湿润
    第三人称单数:moiste

    生活 2021年10月26日
  • Promise的介绍及基本用法是什么

    技术Promise的介绍及基本用法是什么这期内容当中小编将会给大家带来有关Promise的介绍及基本用法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Promise是ES6引入的

    攻略 2021年10月22日
  • MySQL项目中常用的19条优化方法分别是什么

    技术MySQL项目中常用的19条优化方法分别是什么MySQL项目中常用的19条优化方法分别是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获

    攻略 2021年11月29日
  • MySQL多版本并发控制机制源码分析

    技术MySQL多版本并发控制机制源码分析本篇内容主要讲解“MySQL多版本并发控制机制源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL多版本并发控制机制源码分

    攻略 2021年12月3日
  • linux中如何使用cacti简单配置文档

    技术linux中如何使用cacti简单配置文档这篇文章给大家分享的是有关linux中如何使用cacti简单配置文档的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、Cacti安装部署搭建这个平

    攻略 2021年11月15日
  • C++设备模板怎么声明和定义

    技术C++设备模板怎么声明和定义这篇文章主要讲解了“C++设备模板怎么声明和定义”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++设备模板怎么声明和定义”吧!将片上外设

    攻略 2021年11月30日