0

私は3層のアプリケーションを持っています:

  1. クライアント アプリケーション
  2. サーバー アプリケーション
  3. データベース サーバー

サーバーは Entity Framework 4 を使用して、データベースとの間でデータの読み取りと書き込みを行います。

次の状況を想像してください。

  1. クライアント アプリケーションは、プロパティを持つエンティティのインスタンスを作成しますRowVersion。この時点で、プロパティは null と等しくなります。
  2. クライアント アプリケーションは、「このインスタンスをデータベースに保存する」という要求をサーバーに送信します。
  3. サーバーはオブジェクトをデータベースに保存し、RowVersionプロパティの値を自動的に設定します。しかし、クライアント側では、その値はまだ null に等しいです。
  4. クライアント アプリケーションは、最初のステップで作成したオブジェクトを変更し、サーバーに要求を送信します。サーバーは、オブジェクトの新しいバージョンを保存しようとすると、同時実行例外を取得します。

この種の問題を解決するための標準的なメカニズムはありますか?

4

1 に答える 1

1

システムが内部でどのように機能するかはわかりません (クライアントとサーバーの間の通信は、何らかの API を使用して行われると考えてください)。2 つのクライアントが同じエンティティを変更している状況を処理しようとしていることがわかりますが、クライアントが現在よりも古いバージョンを保存しようとしている場合は、クライアントに通知する必要があります。

だから私は次にやります:

  • ステップ 3 で、サーバーはバージョン ID を返す必要があります (エンティティの最初の保存)
  • クライアントによるエンティティの次の変更にはバージョン ID があり、現在のバージョン ID がサーバー上にあるものと同じか古いかどうかを確認する必要があります (rowversion はタイムスタンプであると考えてください)。
  • サーバー ロジックはこの状態を処理し、クライアントの応答に送信します。保存された新しいバージョン (現在のバージョンが同じで、新しいバージョン ID が返される場合) またはバージョンが古い場合 (他のクライアントが既に変更を行っている場合) は false 状態です。

これは単純化した方法です。

[アップデート]

この記事では、ニーズに非常に近い実装を見つけることができます: http://weblogs.asp.net/ricardoperes/archive/2012/05/28/yet-another-asp-net-mvc-crud-チュートリアル.aspx

于 2013-04-09T08:38:08.747 に答える