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)

相关推荐

  • Python 爬取朋友圈最新方法!!

    技术Python 爬取朋友圈最新方法!! Python 爬取朋友圈最新方法!!在几年前,互联网上曾经出现过一款生成朋友圈相册的产品。但是它的流程说起来很不互联网:首先,需要添加指定的微信号,并且给这个微

    礼包 2021年12月18日
  • 知识也是有质量的

    技术知识也是有质量的 知识也是有质量的关键字
    知识搬运工、知识提炼者、知识结晶、知识孤岛、知识宫殿
    何为知识搬运工
    知识搬运工是指那些通过阅读将作者的知识搬运到自己脑子里的一群人,他们不求理解,只求记忆

    礼包 2021年10月26日
  • 阅读笔记:程序员修炼之道4

    技术阅读笔记:程序员修炼之道4 阅读笔记:程序员修炼之道4让你的用户参与权衡通常你是为别人编写软件。你常常需要记得从他们那里获取需求2﹒们你是否常t他们、他们想要他们的软件有多好有时候选择并不存在:如果

    礼包 2021年11月29日
  • Python中选择结构是怎么样的

    技术Python中选择结构是怎么样的这篇文章主要介绍了Python中选择结构是怎么样的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、选择结构通过判断条

    攻略 2021年10月31日
  • java的开发工具有哪些(java开发工具用什么比较好)

    技术Java开发工具有哪些本篇内容介绍了“Java开发工具有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1、C

    攻略 2021年12月22日
  • 一个方法或变量是private属性的访问范围是什么

    技术一个方法或变量是private属性的访问范围是什么本篇文章给大家分享的是有关一个方法或变量是private属性的访问范围是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟

    攻略 2021年11月9日