2

背景: Silverlight 4 - RIA - Entity Framework 4

説明: 次のような削除コードがあります。

db.Items.Remove(selectedItem);
db.SubmitChanges(deleteItemOperationCompleted, null);

ここでは、アイテムがドメイン コンテキストから削除され、サービスは EF で操作を実行しようとします (これにより、DB で操作が実行されます)。

コールバック メソッド:

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

再現: アイテムを削除しようとしました (データベースの参照整合性制約のため削除できません)。エラーが発生したというメッセージが表示されます。それで大丈夫です。次に、他のアイテム (外部キーによって他のエンティティに関連付けられていないアイテム) を削除しようとすると、このアイテムをデータベースから削除できるにもかかわらず、同じメッセージが表示されます。

問題は、ドメイン コンテキストから最初の項目を削除したことです (データベースからは削除されていませんが)。したがって、2 番目の項目を削除しようとすると、コンテキストからも削除されます。変更を送信するとき、最後の項目を DB から削除できますが、問題は、変更がコンテキスト全体に対して送信されることです。最初のステップで、DB から削除できない項目を削除したため、送信操作は失敗します。

質問:送信に失敗した場合に操作を「ロールバック」する正しい方法 (ベスト プラクティス) は何ですか? 私が考えることができる唯一の考えは、別のドメインコンテキストを作成してデータを再度ロードすることですが、ロードされるデータの量のためにそれを避けたいと思います. コンテキストを以前の状態に戻すか、保留中の変更をキャンセルできますか? この問題にアプローチするには?

4

1 に答える 1

2

あなたの場合、 DomainContext でRejectChangesを呼び出して、アイテムの削除をキャンセルし、そのEntityStateを Unmodified に戻す必要があります。

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
  }
}
于 2011-10-06T07:15:25.210 に答える