探索EF核心更新土地:加入我们的激动人心的旅程
#教程 #dotnet #database #efcore

实体框架(EF)Cor​​e是一个流行的.NET开发人员的流行对象凝聚映射(ORM)框架,可简化使用关系数据库的工作。 EF Core提供了多种方法来更新数据库中的数据,包括AddUpdateRemove方法。这些方法使开发人员能够使用C#或VB.NET代码在数据库中修改数据,而无需编写任何SQL语句。

ð— fef核心更新土地

该更新方法用于修改数据库中的现有实体。开发人员可以修改实体对象的属性,并在相应的DbSet上调用更新方法,以将实体标记为修改。调用SaveChanges时,EF Core将生成必要的SQL语句以更新数据库中的相应记录。

除了这些基本方法外,EF Core还提供了更高级的方法来更新数据库中的数据。其中包括用于批处更新的方法,可用于更新单个操作中的多个记录,以及执行RAW SQL语句的方法,这对于执行无法使用EF Core的标准方法表示的复杂更新很有用。

总的来说,EF Core的更新方法为开发人员提供了一种灵活,有效的方法,可以使用面向对象的编程技术在关系数据库中修改数据。这些方法可以帮助开发人员编写更清洁和更可维护的代码,同时减少使用数据库所需的时间和精力。

½准备飞机燃料

我们需要一个大量的数据库来查询并响应问候结果,因此我们使用The Microsoft Worldwide Database Sample for SQL Server

SQL Server的Microsoft Worldwide Database Sample是一个示例数据库,旨在演示Microsoft SQL Server的功能。它包含虚构跨国组织的一组现实数据,包括与销售,客户,订单和产品有关的数据。

该数据库旨在展示数据仓库,在线交易处理(OLTP)和数据分析等功能。开发人员,数据库管理员和其他IT专业人员可以使用它来了解SQL Server并练习构建和优化查询。

全球数据库示例可从Microsoft website下载,其中包括文档和示例查询,以帮助用户启动。对于希望获得SQL Server实用经验并探索平台功能的任何人来说,这都是一个有用的资源。

要还原此数据库,请执行以下步骤:

  • 从Microsoft下载中心下载示例数据库备份文件。备份文件命名为“ wwi.bak”,大小约为432 MB。

  • 打开SQL Server Management Studio(SSM)并连接到您的SQL Server实例。

  • 右键单击对象资源管理器窗格中的“数据库”节点,然后选择“还原数据库”。

  • 在“还原数据库”对话框中,选择“设备”作为源,然后单击其旁边的“ ...”按钮。

  • 在“选择备份设备”对话框中,单击“添加”按钮,然后浏览到保存wwi.bak文件的位置。

  • 选择备份文件,然后单击“确定”以关闭“选择备份设备”对话框。

  • 回到“还原数据库”对话框中,请确保“到数据库”字段设置为“ WWI”。

  • 在“选项”窗格中,选择“覆盖现有数据库(使用替换)”,然后单击“确定”以启动还原过程。

  • 恢复过程完成后,您应该在对象资源管理器窗格中看到“ WWI”数据库。

现在,您可以使用全球进口商示例数据库探索和学习SQL Server功能和功能。您可以使用此link以获取有关如何还原此数据库的更多信息。

飞机发动机放置

现在,我们需要一个工具将数据库带入控制台项目;我们发现EF Core Power Tools非常有用。

ef核心电动工具是一个视觉工作室扩展,可为实体框架核心开发人员提供其他功能。该工具通过提供现有数据库中的DBContext和实体类,可视化数据库架构并生成迁移来帮助开发人员使用EF Core。您可以使用此link下载并使用它。

使用EF核心电动工具将数据库首先导入您的控制台项目,请执行以下步骤:

  • 从Visual Studio Marketplace安装EF核心电动工具Visual Studio扩展。
  • 在Visual Studio中打开控制台项目。
  • 右键单击解决方案资源管理器中的项目,然后选择“ EF核心电动工具” - >“反向工程”。
  • 在“反向工程师”对话框中,选择“数据库”作为数据源。
  • 在“连接字符串”字段中输入数据库的连接字符串。您可以单击“编辑”按钮以配置其他连接设置。
  • 选择要包含在模型中的表,视图和存储过程。您还可以指定模式或排除特定对象。
  • 选择要生成模型文件的名称空间和目录。
  • 选择生成的代码(C#或VB.NET)的语言。
  • 单击“确定”以启动反向工程过程。
  • EF核心电源工具将基于所选数据库对象生成模型文件。现在,您可以在控制台项目中使用生成的DBContext和实体类来与数据库一起使用。

注意:EF核心电动工具生成使用EF Core访问数据库的代码。如果要使用其他ORM或数据访问库,则需要相应地修改生成的代码。

我们已经准备好踏上有关EF Core的最新发展的旅程。

ð更新站点

Updaterange是一种由实体框架核心(EF Core)提供的方法,该方法允许开发人员更新单个数据库事务中的多个实体。此方法是DBSET类的一部分,可用于更新单个调用数据库中的实体集合。

在EF核心中,一次更新一个实体可能是一个效率低下的过程,因为它可能导致大量数据库调用。更新方法方法有助于通过允许开发人员更新single transaction中的实体集合来有助于优化此过程,将往返数量减少到数据库中。

使用Updaterange时,开发人员只需要传递一个实体集合即可更新。然后,EF Core将生成单个SQL语句,该语句在单个事务中更新集合中的所有实体。这可以显着提高性能,尤其是在更新大量实体时。(我们稍后再解释)

值得注意的是,更新仅更新数据库中的现有实体。如果集合中的实体尚未在数据库中,则将被忽略。此外,更新仅更新每个实体中已修改的属性。如果属性尚未修改,则不会更新。

总体而言,更新是EF Core提供的有用方法,可以在更新多个实体时有助于提高性能。它允许开发人员在单个数据库事务中更新一个实体集合,从而减少到数据库的往返数量并提高整体效率。

public async Task EfCoreUpdateRangeAsync()
 {
   var context = new WideWorldImportersContext();
   var people = await context.People.ToListAsync();
   people.ForEach(i => i.LogonName = "Test");
   context.People.UpdateRange(people);
   await context.SaveChangesAsync();
 }

ð执行操作站

ExecuteUpDateAsync是Entity Framework Core(EF Core)提供的一种方法,该方法允许开发人员使用自定义SQL语句执行批量数据库更新。此方法可用于对单个数据库事务中的大量数据进行更新,从而提高更新操作的性能。

与EF Core提供的其他更新方法不同,ExecuteUpDateasync是一个bulk operation,一次更新了多个记录。在更新单个操作中的大量记录时,这可能很有用,因为它可以显着减少所需的数据库往返数量。

该方法将RAW SQL字符串作为输入,可以进行参数化以进行更灵活,更安全的更新操作。它还支持异步执行,这意味着它可以在单独的线程上执行而无需阻止主线程。

值得注意的是,ExecuteUpDateasync绕过EF Core的更改跟踪和验证机制,因此应谨慎使用。开发人员应确保自定义SQL声明是安全的,并满足必要的安全要求。

总体而言,ExecuteUpDateasync是EF Core提供的强大方法,用于批量更新。它可以提高大规模更新操作的性能,但应谨慎使用以避免使用变化跟踪和验证的潜在问题。

public async Task EfCoreExecuteUpdateAsync()
 {
   var context = new WideWorldImportersContext();
   await context.People.ExecuteUpdateAsync(p => p.SetProperty(pr => pr.LogonName, "Test"));
   await context.SaveChangesAsync();
 }

ðbatchupdateasync站

batchupdateasync是第三方库z.entityframework.extensions提供的一种方法,该方法扩展了实体框架核心(EF Core)的功能。这种方法允许开发人员使用高性能批处理技术对数据库执行批量更新。

batchupdateasync可用于更新单个数据库事务中的多个记录,从而减少了数据库的往返数量并改善了更新操作的性能。该方法支持广泛的数据库提供商,可以与SQL Server,MySQL,Oracle,PostgreSQL等一起使用。

batchupdateasync旨在与EF Core的Iqueryable接口一起使用,允许开发人员使用LINQ Expressions执行更新。该方法采用可音机作为输入和lambda表达式,以定义要执行的更新操作。

该方法支持多种控制更新行为的选项,包括过滤,投影和交易管理。它还支持异步执行,使其适用于需要快速更新的高性能应用程序。

值得注意的是,batchupdateasync是需要商业用途许可的第三方库。但是,图书馆提供了一个免费的试用版,可用于非商业目的。

 public async Task EfCoreBatchUpdateAsync()
   {
     var context = new WideWorldImportersContext();
     await context.Set<Person>()
           .BatchUpdateAsync(new Person()
           {
             LogonName = "Test"
           }, new List<string>()
           {
             nameof(Person.LogonName)
           });
   }

ðBulkupdate站

bulkupdateasync是第三方库Efcore.bulkextensions提供的一种方法,该方法扩展了实体框架核心(EF Core)的功能。此方法允许开发人员使用高性能方法对数据库进行批量更新。

bulkupdateasync可用于更新单个数据库事务中的多个记录,从而减少了数据库的往返数量并改善了更新操作的性能。该方法支持广泛的数据库提供商,可以与SQL Server,MySQL,Oracle,PostgreSQL等一起使用。

bulkupdateasync旨在与EF Core的Iqueryable接口一起使用,从而使开发人员可以使用LINQ表达式执行更新。该方法采用可音机作为输入和lambda表达式,以定义要执行的更新操作。

该方法支持多种控制更新行为的选项,包括过滤,投影和交易管理。它还支持异步执行,使其适用于需要快速更新的高性能应用程序。

值得注意的是,efcore.bulkextensions是第三方库,需要商业用途的许可。但是,图书馆提供了一个免费的试用版,可用于非商业目的。

public async Task EfCoreBulkUpdateAsync()
 {
   var context = new WideWorldImportersContext();
   var people = context.People.ToList();
   people.ForEach(p => p.LogonName = "Test");
   await context.BulkUpdateAsync(people);
 }

ð§ª测试

现在是时候删除我们的更新软件包,看看谁在更新People表中的1,111个数据了。你准备好了吗?

Image description

由于其令人印象深刻的效率,必须认识到使用ExecuteUpdateAsync和batchupDateasync的重大影响。例如,如果需要更新1,000,000个记录,则效率低下的方法可能会导致系统崩溃并与其他数据超载,从而使管理如此庞大的任务变得困难。

ð结论

updaterange,executeUpDateAsync,batchupDateasync和bulkupdateasync是Entity Framework Core(EF Core)提供的所有方法及其第三方扩展程序,用于执行Bulk的更新。

>

>

UpdateRange是一种内置的EF核心方法,允许开发人员在单个数据库事务中更新多个记录。它旨在与追踪实体合作,可用于一次更新多个实体。它不会绕过EF Core的更改跟踪和验证机制。

ExecuteUpdateAsync是EF Core提供的一种方法,它允许开发人员执行自定义SQL语句执行批量更新。它绕过EF Core的更改跟踪和验证机制,因此不适合需要这些机制的复杂更新操作。

BatchUpdateAsync是第三方库z.entityframework.extensions提供的方法,它允许开发人员使用高性能批处理技术执行批量更新。它支持广泛的数据库提供商,并为控制更新行为提供了多种选择。

BulkUpdateAsync是第三方库Efcore.bulkextensions提供的一种方法,该方法还允许开发人员使用高性能方法执行批量更新。它提供了与batchupdateasync相似的功能,但支持不同的数据库提供商。

与其他批量更新方法相比,更新的速度可能会很慢,因为它依赖于EF Core的change tracking mechanism来检测更新的实体的更改。这意味着更新过程必须查询数据库以检索实体,在内存中更新它们,然后为每个实体生成和执行单个SQL Update语句。对于大型数据集而言,这可能很慢,因为涉及检索和单独更新每个实体的间接费用。

另一方面,诸如batchupdateasync和bulkupdateasync之类的批量更新方法直接在数据库上运行,而无需依赖更改跟踪。这些方法使用SQL Update语句来更新单个事务中的多个记录,这比为每个记录生成单个更新语句要快得多。此外,这些方法通常提供诸如批处理处理之类的功能以及指定每批更新的记录数量的能力,这可以进一步优化性能。

总而言之,由于依靠变更跟踪,因此更新可能比其他批量更新方法慢,这在更新大型数据集时可能会导致大量开销。如果是一个问题,则使用BatchupDateasync或BulkupDateasync(例如BatchupDateasync)(例如,可能是更好的选择)。但是,重要的是要权衡每种方法的好处和缺点,然后选择最满足您特定要求的方法。

总的来说,这些方法之间的主要区别在于它们执行批量更新的方法及其提供的控制水平。 Updaterange是一种内置的EF核心方法,它为更新多个记录提供了基本解决方案。 ExecuteUpDateasync提供了执行自定义SQL更新的能力,但要绕过更改跟踪和验证机制。 BatchupDateasync和BulkupDateasync都为批量更新提供了高性能的解决方案,但是它们由第三方库提供,并且需要商业用途的许可证。他们提供了一系列用于控制更新行为的选项,但也需要其他设置和配置。

ð赞赏

我想感谢Ziba在本文中成为如此出色的合作者。这是我们第一次一起写作,我不能要求一个更好的伴侣。 Ziba的才华和辛勤工作确实是鼓舞人心的,我很荣幸能与如此难以置信的人一起工作。 Ziba慷慨地同意我的提议一起写这篇文章,我非常感谢。

我们的团队很幸运地将Ziba带入该结构。他们的贡献和专业知识导致了重大改进和出色的成果。 Ziba愿意分享他们的知识和帮助他人,这是令人钦佩的,并受到了极大的赞赏。如果您想与这个非凡的人建立联系,我强烈建议您检查她的LinkedIn profile