Фон: Silverlight 4 - RIA - Entity Framework 4
Описание: У меня есть какой-то код удаления, в котором я делаю:
db.Items.Remove(selectedItem);
db.SubmitChanges(deleteItemOperationCompleted, null);
Здесь элемент удаляется из контекста домена, а затем служба пытается выполнить операцию на EF (которая, в свою очередь, выполняет операцию на БД).
Метод обратного вызова:
private void deleteOperationCompletedM(SubmitOperation op)
{
if (op.Error == null)
{
MessageBox.Show("Delete operation was successfull.");
// Some other code here (removed for brevity)
}
else
{
op.MarkErrorAsHandled();
MessageBox.Show("An error has occured." + op.Error.Message);
}
}
Repro: Я пытаюсь удалить элемент (который НЕ МОЖЕТ быть удален из-за ограничения ссылочной целостности в базе данных).Я получаю сообщение о том, что произошла ошибка.Это нормально.Затем, когда я пытаюсь удалить какой-либо другой элемент (который не связан внешним ключом с каким-либо другим объектом), я получаю то же сообщение, даже если этот элемент можно удалить из базы данных.
Проблема в том, что я удалил первый элемент из контекста домена (даже если он не был удален из базы данных).Поэтому, когда я пытаюсь удалить второй элемент, он также удаляется из контекста.При отправке изменений последний элемент может быть удален из БД, но проблема в том, что изменения передаются для всего контекста, и, поскольку на первом этапе я удалил элемент, который нельзя удалить из БД,операция отправки завершается неудачей.
Вопрос: Как правильно (оптимальным способом) «откатить» операцию в случае ошибки отправки?Единственное, о чем я могу думать, - это создать другой контекст домена и снова загрузить данные, но я бы хотел этого избежать из-за объема загружаемых данных.Можно ли вернуть контекст в какое-то предыдущее состояние или отменить ожидающие изменения?Как подойти к этой проблеме?