Поддержание DomainContext в актуальном состоянии при сбое SubmitOperation - PullRequest
2 голосов
/ 06 октября 2011

Фон: 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: Я пытаюсь удалить элемент (который НЕ МОЖЕТ быть удален из-за ограничения ссылочной целостности в базе данных).Я получаю сообщение о том, что произошла ошибка.Это нормально.Затем, когда я пытаюсь удалить какой-либо другой элемент (который не связан внешним ключом с каким-либо другим объектом), я получаю то же сообщение, даже если этот элемент можно удалить из базы данных.

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

Вопрос: Как правильно (оптимальным способом) «откатить» операцию в случае ошибки отправки?Единственное, о чем я могу думать, - это создать другой контекст домена и снова загрузить данные, но я бы хотел этого избежать из-за объема загружаемых данных.Можно ли вернуть контекст в какое-то предыдущее состояние или отменить ожидающие изменения?Как подойти к этой проблеме?

1 Ответ

2 голосов
/ 06 октября 2011

В вашем случае вы должны позвонить RejectChanges на свой DomainContext, чтобы отменить удаление элемента и изменить его EntityState обратно на Неизмененный.

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);

    db.RejectChanges();  // call reject changes on the DomainContext
  }
}
...