1

私は ASP.NET を初めて使用するので、私の質問は愚かで、長年の Java/JSF の使用に影響されている可能性があります。

ASP.NET と MVC3 および Entity Framework 4.1 を使用して Web アプリケーションを実装したいと考えています。これはビジネス アプリケーションであるため、データ操作を防止し、並行性を確保することにより、セキュリティを確保する必要があります。

そこで、Entity Framework がサポートする楽観的ロックを使用することを計画しました。しかし、MVC パラダイムとそれが提供するオプションの使用に関しては、上記のセキュリティ面をどのように実現すればよいかわかりません。

属性を持つエンティティタイプ「顧客」のドメインモデルがあります

  • ID (データベース PK)
  • 名前
  • 誕生日
  • バージョン (楽観的ロックに使用)

ビューがそのデータを編集できるように準備するために、次の属性を持つビュー モデル「customerView」を追加で使用します。

  • 名前

コントローラーでは、データベースから特定のレコードを読み込み、値をビュー モデルに転送して、厳密に型指定されたビューに配置します。これはうまく機能します。値は Web フォームに表示され、変更をポストバックできます。ビュー モデルには ID とバージョンが含まれていない (その結果、ポストバックの一部ではない) ため、要求応答ライフサイクル中に失われたため、値をドメイン モデルにマップすることができません。

確かに、ID とバージョンを非表示の入力フィールドとして追加できますが、これはデータ操作が可能になるので避けたいものです。データを送信する前に誰かが ID またはバージョンを変更する可能性があります。サーバーに送信されたデータと Web フォームに配信されたデータ (特に ID とバージョン) を比較できないため、望ましくない動作が発生する可能性があります。

不要なフィールドを前後に送信しないようにするために、セッションで編集ビューを表示する前に取得したデータレコード/ドメインモデル (または少なくともレコードの ID) を保存する方法があると思いますが、そうではないことはわかっていますアプリケーションのパフォーマンスに影響を与える可能性があります。SQL Server などのデフォルトのセッション状態とは別のセッション状態を使用するのはどうですか? これにより、ビュー モデルから値を転送するためにデータベースからレコードをもう一度読み込む必要がないため、少なくとも 1 つのデータベース操作を節約できます。セッションからドメイン モデル レコードを取得でき、データ操作をチェックすることさえできます。

この例が、私が直面している問題を示していることを願っています。

これらの問題に対処するためのさらに良い方法があるかもしれません。多分私は完全に混乱しています;)

4

2 に答える 2

0

競合状態に関しては、最初に尋ねるべき質問は次のとおりです。実際に無効なレコードにつながる同時アクティビティの確率はどれくらいですか?

あなたの場合: ID、名前、誕生日を持つ顧客がいる場合、2 人の同時ユーザーが同時に顧客を編集し、異なるデータを入力するという一般的なシナリオは考えられません。あるユーザーがある名前または誕生日を入力し、別のユーザーが同時に別の名前または誕生日を入力するのはなぜですか?

私が言いたいこと: ほとんどの場合、問題の可能性は、ロックや同様の保護手段に伴う労力と使いやすさの損失、およびパフォーマンスと比較して無視できます。

このトピックに関する非常に優れた記事: Race Conditions Don't Exist by Udi Dahan

于 2012-01-31T10:00:51.733 に答える
0

ビューに ID を含める必要があります。他に方法はありません。データ操作に関しては、(保存するたびに) ユーザーがこの ID でオブジェクトを変更できることを確認する必要があります。

同じことがバージョン スタンプにも当てはまりますが、この場合、データ操作について心配する必要はありません。データベース内のタイムスタンプに一致するタイムスタンプを手動で生成することは事実上なく、それらが一致しない場合は編集が行われないため、安全です。または、編集中のすべてのフィールドの元の値を渡すときに、他の同時実行性チェック シナリオを切り替えることができます。

于 2012-07-30T12:31:53.663 に答える