Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架4.1批量更新_Entity Framework_Transactions_Batch File - Fatal编程技术网

Entity framework 实体框架4.1批量更新

Entity framework 实体框架4.1批量更新,entity-framework,transactions,batch-file,Entity Framework,Transactions,Batch File,我正在使用EF4.1做一些工作,我想对3个表执行批更新(为了实现软删除)。通过快速研究,直接SQL查询似乎是最好的。下面是我的实现,我希望得到一些关于这是否是最佳实践的反馈。谢谢你的帮助 using (var scope = new TransactionScope()) { using (var db = new TimeCatchDb()) { db.Database.ExecuteSqlCommand("UPDATE EmployeeRecords S

我正在使用EF4.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();
}

如果需要批处理,为什么不将所有更新放在单个
ExecuteSqlCommand
?对
ExecuteSqlCommand
的每次调用都会返回数据库=它不是一个批处理。还要注意,如果当前在上下文中加载了任何修改的记录,则不会反映更改=加载的实体仍将有
删除=1
。直接SQL命令只影响数据库


在正常的EFv4+EDMX中,最好通过将自定义存储过程映射到
Delete
操作(但它也不支持批处理)来实现这一点,但如果没有EDMX,则无法实现这一点。

可以使用以下扩展扩展扩展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"})

.

为什么不为此使用存储过程?没有存储过程,维护的位置就更少了