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