私は 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 つのデータベース操作を節約できます。セッションからドメイン モデル レコードを取得でき、データ操作をチェックすることさえできます。
この例が、私が直面している問題を示していることを願っています。
これらの問題に対処するためのさらに良い方法があるかもしれません。多分私は完全に混乱しています;)