如何批量更新实体框架中的记录?

Ujj*_*l27 16 c# linq entity-framework entity-framework-extended bulkupdate

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

Update方法能够使用相同的更新值集批量更新一组记录.

例:

           Id -  Quantity
Record 1 - A  -  10
Record 2 - B  -  20
Record 3 - C  -  30
Run Code Online (Sandbox Code Playgroud)

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

Records.Update(new => Record { Quantity = 100 });
Run Code Online (Sandbox Code Playgroud)

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

Gré*_*gin 19

如果您不想使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您只想更新实体的一个属性,是否必须将所有其他属性设置为其现有值,否则它将使未设置的任何内容无效? (13认同)
  • 附加实体不足以触发更新,因为默认情况下它附加为“未更改”。在调用 `Attach` 之后,您需要调用 `db.Entry(entityToUpdate).Property(e => e.Quantity).IsModified = true`。在 EF Core 中,您可以省略 Attach,因为调用“Entry”将附加它。 (2认同)

Sal*_*ari 17

用途ExecuteSqlCommand:

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

或者ExecuteStoreCommand:

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

  • 这是最好的答案。它没有得到最高投票的唯一原因是因为它对于那些认为这是“黑客”的真正信徒来说“感觉”不正确。EF 旨在让生活更轻松;当它不起作用时,就放弃它并做有效的事情。 (2认同)

Lib*_*tad 8

EFCore 中有 EFCore 7.0 提供的内置函数ExecuteUpdate和方法ExecuteDelete

context.Customers.Where(...).ExecuteDeleteAsync();
context.Customers.Where(...).ExecuteUpdateAsync(c => new Customer { Age = c.Age + 1 });
context.Customers.Where(...).ExecuteUpdateAsync(c => new { Age = c.Age + 1 });
Run Code Online (Sandbox Code Playgroud)


Ben*_*ert 5

如果您只想修改一些属性,请使用这种方法:

foreach (var vSelectedDok in doks)
{
    //disable detection of changes to improve performance
    vDal.Configuration.AutoDetectChangesEnabled = false;
    
    vDal.Dokumente.Attach(vSelectedDok);

    vDal.Entry(vSelectedDok).Property(x=>x.Status).IsModified=true;
    vDal.Entry(vSelectedDok).Property(x => x.LastDateChanged).IsModified = true;
}
vDal.SaveChanges();
Run Code Online (Sandbox Code Playgroud)