2

私は MVC 3 Razor (c#) を使用しており、私のビューでは、ユーザーが Name プロパティのみを更新できるエンティティを表示しています。

public class Product{
    public Guid Id {get; set; }
    public string Name {get; set;}
    public string Type {get; set;}
  }

オブジェクトを再度保存する前にデータベースからオブジェクト全体をロードしないようにするには、次のような方法を使用します。

public void UpdateProduct(Guid id, Hashtable propertiesToUpdate) {}

ビジネス オブジェクトで、AJAX 要求またはフォーム ポストのいずれかによってエンティティの一連のプロパティを更新できるようにします。(データの一貫性はタイムスタンプを使用して行われます)。

変更が検出されたときに INotifyPropertyChanged を使用してプロパティを更新するなどの他の方法を見てきましたが、これは、リクエスト間でインスタンスを保持できる場合、または変更を行う前にエンティティ全体をロードできる場合にのみ役立つようです (重いようです)。 .

NHibernate は同様の考え方で dynamic-update を使用しています。これにより、NHibernate はデータベースからデータをロードし、更新ステートメントを生成する前に比較を行いますか?

リクエスト間で編集中のオブジェクト (Session[]?) を維持する最善の方法、または個々のプロパティを更新する (エンティティ属性値モデルに移行せずに) あまり扱いにくい方法はありますか?

4

2 に答える 2

0

要するに、それを行うためのクリーンな方法は、更新したい Entity ID パラメーターと一連のプロパティ値を取得し、それらをサービス レイヤーに渡すことです。

サービス層では、エンティティ識別子を使用してリポジトリを呼び出し、単一のエンティティを取得して、実行したい特定のプロパティを更新できます。

ただし、一般的なアプローチは、DTO オブジェクトの 原則を使用して、CRUD 操作をきれいに合理化することです。DTO とそれが役立つ場所についての詳細。

于 2013-01-04T05:21:27.513 に答える
0

ルーティングとコントローラーのインスタンス化を処理するアプリケーション自体を除いて、MVC には状態がありません。AppDomain リサイクルのようにランダムに破棄されないことを保証する適切な方法がないため、アプリケーションにある種の状態を押し込もうとはしません。ページをロードするときに一度データベースからレコードを取得し、POST データで更新するときにもう一度レコードを取得することに何か問題がありますか? それが通常行われている方法だと思います。NHibernate で時間がかかる唯一のことは、SessionFactory の作成です。それ以外はすべて非常に高速です。

編集:コメントから拡張すると、NHibernate が存在するため、モデル (データベース) とコントローラーの間のインターフェイスの実装の詳細について心配する必要はありません。これは、すべての配管を処理するフレームワークです。アプリケーション全体に波及効果を及ぼすことなく、重要な機能を後日別のものと簡単に交換できるように、モジュール方式でアプリケーションを構築します。NHiberante ロジックをリポジトリ パターンでラップします。その後、コントローラーがデータ層と通信する方法を変更することなく、将来別の ORM を使用できます。これを支援するために、制御の反転/依存性注入を検討することをお勧めします。

于 2013-01-04T02:57:12.453 に答える