Entity Framework中删除操作最高效的方式是什么?

12

我有以下代码,并希望寻找一种更高效的删除方式,而不是循环遍历每条记录并逐个进行删除(注意使用Dbset):

     var wcd = dbContext.ProgramDetails.Where(p => p.Id == Id);

     foreach (var wc in wcd.ToList())
     {
        dbContext.ProgramDetails.Remove(wc);
     }

     dbContext.SaveChanges();

还有一个记录,如下所示:

    var pg = dbContext.Program.Where(p => p.Id == Id && Name == FName);

最佳的删除一个记录的方法是什么?

我尝试了以下代码但出现了错误:

    var pg = dbContext.Program.Where(p => p.Id == Id && Name == FName);
    dbContext.Program.Remove(wc);

接着我采用了foreach循环来删除单个记录,正如我之前所展示的那样,但对于仅有一个记录而言,这并不是最有效的方法。


如果你不追踪这些实体并知道它们的ID(而且你有很多ID),你可以考虑使用SQL查询。这样你就不需要把实体带到上下文中再进行删除操作。这有点绕过了EF,所以你需要回答这个问题:这是否值得。 - Pawel
1个回答

14

EF7更新:

using (var db = new BloggingContext())
{
  var blog = db.Blogs.First(p => p.Id == Id);
  db.Remove(blog);
  db.SaveChanges();
}

2015年5月更新:请查看msdn上的更新文档和示例代码。使用EF6删除实体的示例代码:

 public async Task<ActionResult> Delete(Department department) 
 { 
        try 
        { 
            db.Entry(department).State = EntityState.Deleted; 
            await db.SaveChangesAsync(); 
            return RedirectToAction("Index"); 
        } 
        catch (DbUpdateConcurrencyException) 
        { 
            return RedirectToAction("Delete", new { concurrencyError = true, id = department.DepartmentID }); 
        } 
        catch (DataException /* dex */) 
        { 
            //Log the error (uncomment dex variable name after DataException and add a line here to write a log. 
            ModelState.AddModelError(string.Empty, "Unable to delete. Try again, and if the problem persists contact your system administrator."); 
            return View(department); 
        } 
 } 

如果您知道实体的ID但尚未加载实体,则最有效的方法是创建虚假实体并将其删除。

var p = new Program  { Id = myId } 
dbContext.Program.Remove(p)

但是,如果您确实有多条记录具有相同的 ID 并且需要使用 name 字段来选择正确的记录,则此方法不起作用。

同时,您最后的示例应该为

var pg = dbContext.Program.First(p => p.Id == Id && p.Name == FName);
dbContext.Program.Remove(pg);

还有别忘了保存更改,否则删除操作无法生效。 - John Henckel
这对我不起作用!我正在使用EF 6.1。我收到错误消息-->在EntityFramework.dll中发生了类型为'System.InvalidOperationException'的异常,但未在用户代码中处理。其他信息:无法删除对象,因为在ObjectStateManager中找不到它。 - John Henckel
1
我得到这个错误的原因是我的记录有一个非空的外键。我找到的唯一删除方法是先读取它(使用First)然后再删除它。请参阅... http://forums.asp.net/t/1841285.aspx?How+do+I+delete+a+record+with+Entity+Framework+5 - John Henckel
@JohnHenckel 两年时间里情况有所变化。请查看EF6的原始文档:https://msdn.microsoft.com/zh-cn/data/jj713564(修改关系部分)。 - vittore
“UPDATE FOR EF7” 如何改进任何东西?看起来你写的 “var p = new Program { Id = myId }” 更好(你不需要两次访问数据库)? - BornToCode
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接