Структура сущности; Как обрабатывать исключение в цикле foreach и продолжать итерацию

Когда я повторяю foreach со следующим кодом, он успешно перехватывает первое возникающее исключение и добавляет идентификатор в мой список ошибок. На всех последующих итерациях цикла он будет продолжать перехватывать предыдущее исключение.

Как правильно перехватить исключение и отменить или очистить неудачный запрос 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, и большинство людей сначала обработают все объекты удаления, а затем сохранят изменения, так что это будет одна транзакция. Но мне нужно, чтобы он обрабатывал каждую транзакцию отдельно, чтобы один сбой не останавливал остальные транзакции.

Я использую Entity Framework 4.

Исключение, которое я получаю для этого конкретного примера, вызвано тем, что внешние ключи связаны с удаляемым элементом. Пока я буду работать с этим сценарием в продакшне, он должен продолжаться независимо от исключения.

9
задан tereško 15 June 2013 в 13:50
поделиться