簡體   English   中英

實體框架; 如何處理foreach循環中的異常並繼續迭代

[英]Entity Framework; How to handle an exception in foreach loop and keep iterating

當我使用以下代碼遍歷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和谷歌,大多數人會首先處理所有刪除對象,然后保存更改,以便它是一個事務。 但我需要它來單獨處理每個事務,因此單個故障不會停止其余的事務。

我正在使用Entity Framework 4。

我為此特定示例獲得的異常是由外鍵與要刪除的項關聯引起的。 在生產中我將處理這種情況,它應該能夠繼續,無論例外是什么。

我假設在this.DB this.getValidObject(id)使用相同的上下文this.DB來檢索實體。 如果是這種情況,則在異常塊調用中: this.DB.detach(deleteme) 這應該阻止SaveChanges()嘗試在下一次迭代中刪除有問題的實體。

你提供的代碼看起來不錯。 你看到的錯誤是什么? 正如你所指出的,也許你需要在this.DB.Items中取消標記,盡管我不這么認為。 您還可以嘗試為每個循環創建一個新的DataContext,以使舊的,失敗的DataContext在世界上的狀態無關緊要。

如果我理解正確,則無法刪除實體(Item),因為它具有外鍵關聯(子)。
您首先必須使用要刪除的父(項)更新所有子(相關)實體,方法是刪除關系,更新實體以關聯替代父項(項)或刪除子實體(實體)然后最后刪除Parent(Item)實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM