[英]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.