如何批量更新entity framework中的记录?

我正在尝试使用Entity Framework批量更新记录。 我试过Entity Framework.Extensions Update方法。

Update方法能够为具有相同更新值集的一组记录进行批量更新。

例:

  Id - Quantity Record 1 - A - 10 Record 2 - B - 20 Record 3 - C - 30 

我们可以通过简单的调用批量更新所有上述记录

 Records.Update(new => Record { Quantity = 100 }); 

如何使用Entityframework.Extensions或任何其他方法批量更新具有不同数量的每条记录,从而更快地完成批量更新?

如果您不想使用SQL语句,可以使用Attach方法更新实体而无需先加载它:

 using (myDbEntities db = new myDbEntities()) { try { //disable detection of changes to improve performance db.Configuration.AutoDetectChangesEnabled = false; //for all the entities to update... MyObjectEntity entityToUpdate = new MyObjectEntity() {Id=123, Quantity=100}; db.MyObjectEntity.Attach(entityToUpdate); //then perform the update db.SaveChanges(); } finally { //re-enable detection of changes db.Configuration.AutoDetectChangesEnabled = true; } } 

使用ExecuteSqlCommand

 using (yourDbEntities db = new yourDbEntities()) { db.Database.ExecuteSqlCommand("UPDATE YourTABLE SET Quantity = {0} WHERE Id = {1}", quantity, id); } 

或者ExecuteStoreCommand

 yourDbContext.ExecuteStoreCommand("UPDATE YourTABLE SET Quantity = {0} WHERE Id = {1}", quantity, id); 

批量更新可以通过简单的EF而不是单独的扩展方法分三步完成: –

  • 首先加载所有实体。
  • Foreach在每个实体上并更改其字段值。
  • Foreach保存上下文后更改一次。

这将以单批次发送多个Update查询。

我倾向于说这里的问题不是EntityFramework,而是对如何在SQL中更新记录的期望。 如果您有50条记录,并且要将所有记录的“数量”字段更改为新的唯一值,则需要使用50条命令。 AFAIK,SQL根本没有一种机制来理解如何在没有每条记录的单独命令的情况下更新这些记录。 然后将此限制传递给EF。

也就是说,有几种方法可以尝试通过更新大量记录来获得一些性能:

  • 批量更新 – 正如其他几个答案所提到的,您可以使用批量更新,在单个命令中一次性向SQL发送多个UPDATE语句。
  • 密钥分组 – 如果要在查询中的所有匹配记录上将字段设置为相同的值,则SQL可以使用单个UPDATE命令更新多行。 如果您可以对需要更新的数量进行分组,则可以使用此function。 例如,如果您知道需要将150条记录更新为数量100,则可以将其作为带有WHERE子句的单个UPDATE查询运行,以包含所有相关ID。
  • XML文件:( – SQL有一堆用于处理XML的内置命令。您可以使用UPDATE TBL SET TBL.QUANTITY = XMLTBL.QUANTITY FROM OPENXML(@idoc, '/ROOT/Items',1) 。有关详细信息,请参阅https://docs.microsoft.com/en-us/sql/t-sql/functions/openxml-transact-sql 。

但问题的一部分是,尽可能快地更新记录有多重要? 当然,我们都希望我们的查询速度很快但是如果我们必须实现一些方法以获得性能,那么从长远来看它可能不值得。 例如,你可以在后台线程上运行更新,以便它是非阻塞的吗?

Interesting Posts