【问题标题】:Entity Framework 4.1 Batch UpdatesEntity Framework 4.1 批量更新
【发布时间】:2011-09-06 03:39:44
【问题描述】:

我正在使用 EF 4.1 做一些工作,我想对 3 个表执行批量更新(为了实现软删除)。通过一些快速研究,看起来直接 SQL 查询是最好的。我的实现如下,我希望得到一些关于这是否是最佳实践的反馈。感谢您的帮助...

using (var scope = new TransactionScope())
{
     using (var db = new TimeCatchDb())
     {

        db.Database.ExecuteSqlCommand("UPDATE EmployeeRecords SET Deleted = 1 WHERE NoteTypeId = @p0", new SqlParameter { ParameterName = "p0", Value = id});

        db.Database.ExecuteSqlCommand("UPDATE Notes SET Deleted = 1 WHERE NoteTypeId = @p0", new SqlParameter { ParameterName = "p0", Value = id });

        db.Database.ExecuteSqlCommand("UPDATE NoteTypes SET Deleted = 1 WHERE Id = @p0", new SqlParameter { ParameterName = "p0", Value = id });
     }

     scope.Complete();
}

【问题讨论】:

  • 为什么不使用存储过程呢?
  • 没有存储过程,需要维护的地方就更少了

标签: entity-framework transactions batch-file


【解决方案1】:

您可以使用以下扩展名扩展 ef

实体框架扩展库

一个扩展实体框架功能的库​​。

特点 •批量更新和删除 •未来查询 •审计日志 项目包和源 NuGet 包

PM> 安装包EntityFramework.Extended

批量更新和删除 实体框架的当前限制是,为了更新或删除实体,您必须首先将其检索到内存中。现在在大多数情况下,这很好。但是,在某些情况下,性能会受到影响。此外,对于单次删除,必须先检索对象,然后才能删除它,这需要两次调用数据库。批量更新和删除消除了在修改实体之前检索和加载实体的需要。

//delete all users where FirstName matches
context.Users.Delete(u => u.FirstName == "firstname");

//update all tasks with status of 1 to status of 2
context.Tasks.Update(
    t => t.StatusId == 1, 
    t => new Task {StatusId = 2});

//example of using an IQueryable as the filter for the update
var users = context.Users
   .Where(u => u.FirstName == "firstname");

context.Users.Update(
   users, 
   u => new User {FirstName = "newfirstname"})

.

【讨论】:

    【解决方案2】:

    如果您想要批量更新,为什么不将所有更新放入单个 ExecuteSqlCommand 中?对ExecuteSqlCommand 的每次调用都会自己往返于数据库= 它不是一个批处理。另请注意,如果当前在上下文中加载了任何已修改的记录,则不会反映更改 = 加载的实体仍将具有 Deleted = 1。直接 SQL 命令只影响数据库。

    在普通 EFv4 + EDMX 中,最好通过将自定义存储过程映射到 Delete 操作来实现这一点(但它也不支持批处理),但是一旦你没有 EDMX,你就不能这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多