次のコードを使用して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を検索しましたが、ほとんどの人は最初にすべての削除オブジェクトを処理してから、1つのトランザクションになるように変更を保存します。ただし、1回の失敗で残りのトランザクションが停止しないように、各トランザクションを個別に処理する必要があります。
EntityFramework4を使用しています。
この特定の例で得られる例外は、削除されるアイテムに関連付けられている外部キーが原因です。本番環境ではこのシナリオを処理しますが、例外が何であっても続行できるはずです。