实体框架4.1批量更新

Cli*_*ead 3 entity-framework transactions batch-file

我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)

小智 13

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

实体框架扩展库

一个库扩展了Entity Framework的功能.

功能•批量更新和删除•未来查询•审核日志项目包和源NuGet包

PM> Install-Package EntityFramework.Extended

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

//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"})
Run Code Online (Sandbox Code Playgroud)

.