3

エンティティ フレームワークを使用して Web アプリを開発しています。オブジェクトのリストをロードし、それをリピーターにバインドして、すべてのアイテムの概要を表示します。ユーザーは、リピーター内の各アイテムの編集アイコンまたは削除アイコンをクリックできます。

例:

項目 1 | 編集 | 消去

項目 2 | 編集 | 消去

...

レコードが読み込まれ、ID および rowversion 列の値が非表示のフォーム フィールドに保持されるため、同時実行のために rowversion 列を使用する場合、編集は正常に機能します。これらの「元の」値は、後で更新を行うときに使用できます。

ただし、ユーザーがレコードの [削除] をクリックした場合は、データベースからオブジェクトを読み込み、DeleteObject() を呼び出してから、SaveChanges() を呼び出します。これに関する問題は、レコードをロードすると、最新の rowversion 値が取得されるため、同時実行チェックが役に立たなくなることです。

レコードを削除するときに同時実行チェックが確実に行われるようにするにはどうすればよいですか?

4

3 に答える 3

5

オブジェクトを削除したい場合、実際にはデータベースからオブジェクトをロードする必要はありません。

代わりに、 を作成しObjectContext、 ObjectToDelete を Attach() 、次に DeleteObject() および SaveChanges() を介してそのコンテキストにアタッチします。したがって、並行性に関する例外を受け取ることができます。

于 2011-07-14T19:45:45.323 に答える
1

この質問への回答を読んだ後、私は次のアプローチを使用することにしました。

  1. 非表示のフォームフィールドを使用して、IDとrowversion値を保存します。
  2. ユーザーが削除ボタンをクリックしたら、データベースからオブジェクトをロードします。このオブジェクトには、非表示フィールドに格納されているものとは異なる可能性のあるrowversion値が含まれています。
  3. 非表示フィールドのrowversion値をオブジェクトの適切なプロパティに割り当てます。
  4. このオブジェクトに対して、オブジェクト状態マネージャーのAcceptChanges()メソッドを呼び出します。これにより、保存したrowversion値が「現在の」値として受け入れられます。
  5. オブジェクトを削除し、オブジェクトコンテキストでSaveChanges()を呼び出します。

したがって、レコードを削除しようとすると、保存した元の行バージョン値がSQLに渡され、行の現在の値と比較されます。それらが一致しない場合、OptimisticConcurrencyExceptionが発生します。

于 2011-09-07T19:12:09.617 に答える
0

Andreas H が指定したアプローチとは異なるアプローチは、ストアド プロシージャを使用して削除を行うことです。そうすれば、ストアド プロシージャ内で同時実行チェックと削除を行うことができ、違反がある場合は例外が発生します。

于 2011-07-14T20:19:21.340 に答える