边肖将与您分享什么是实体框架核心批处理语句。相信大部分人都不是很了解,所以分享这篇文章供大家参考。希望你看完这篇文章后有很多收获。我们一起来看看吧!
实体框架核心(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的截图:
如果我们在EF 6中执行相同的代码,我们将在SQL Server Profiler中看到三个独立的插入语句:
性能和速度差别很大。如果这些查询是针对部署在云端的数据库,也将更具成本效益。现在,让我们看看如果它是一个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个单独的更新语句:
使用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'
正如您所看到的,有单个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个单独的插入语句。使用此选项可以定义最大批量大小。
以上是“Entity Framework Core 批处理语句是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/148266.html