实体框架;如何处理 foreach 循环中的异常并不断迭代

本文关键字:循环 异常 迭代 foreach 框架 何处理 处理 实体 | 更新日期: 2023-09-27 18:35:02

当我使用以下代码循环访问foreach时,它成功地捕获了发生的第一个异常,并将id添加到我的错误列表中。在循环的所有后续迭代中,它将继续捕获上一个异常。

如何适当地捕获异常并撤消或清除失败的 DeleteObject 请求,以便可以执行后续删除。

public ActionResult Delete(int[] ListData)
{
    List<int> removed = new List<int>();
    List<int> error = new List<int>();
    Item deleteMe;
    foreach (var id in ListData)
    {
        deleteMe = this.getValidObject(id);
        if (deleteMe == null)
        {
            error.Add(id);
            continue;
        }
        try
        {
            this.DB.Items.DeleteObject(deleteMe);
            this.DB.SaveChanges();
            removed.Add(id);
        }
        catch (DataException ex)
        {
            // revert change to this.DB.Items?
            error.Add(id);
        }
    }
    if (error.Count > 0)
    {
        return Json(new { Success = false, Removed = removed, Error = error });
    }
    return Json(new { Success = true, Removed = removed });
}

我已经搜索了SO和google,大多数人会先处理所有删除对象,然后保存更改,使其成为一个事务。但是我需要它单独处理每个事务,因此单个故障不会停止其余事务。

我正在使用实体框架 4。

对于此特定示例,我得到的异常是由外键与要删除的项目相关联引起的。在生产中,我将处理这种情况,无论异常是什么,它都应该能够继续。

实体框架;如何处理 foreach 循环中的异常并不断迭代

我假设相同的上下文this.DB ,在this.getValidObject(id)中用于检索实体。如果是这种情况,在异常块调用中:this.DB.detach(deleteme) .这应该可以防止SaveChanges()在下一次迭代时尝试删除有问题的实体。

您提供的代码看起来不错。 您看到的错误是什么? 正如您所指出的,也许您需要取消标记其中的某些内容。.DB。项目,虽然我不这么认为。 您还可以尝试为每个循环创建一个新的 DataContext,以便旧的、失败的 DataContext 在世界上的状态无关紧要。

如果我理解正确,您无法删除实体(Item(,因为它具有外键关联(子项(。
首先,您必须使用要删除的父(项(更新所有子(相关(实体,方法是删除关系,更新实体以关联备用父(项(或删除子实体(实体(,最后删除父(项(实体。