3

私はこのService Layer --> Repository --> Entity Framework (Code-First) w/POCO objectsアプローチを使用していますが、エンティティの更新に苦労しています。

AutoMapper を使用してドメイン オブジェクトをビュー モデルにマップしていますが、データを取得するのに適していますが、その変更をデータベースに戻すにはどうすればよいですか?

純粋な POCO オブジェクトを使用すると、変更追跡のようなものはないと想定されるため、自分で処理するしか選択肢がないことがわかります。ビュー モデルがドメイン オブジェクトとまったく同じプロパティを持っていることを確認しますか? ビュー モデルのフィールドを 1 つまたは 2 つ変更するとどうなりますか? ドメイン オブジェクトの残りのフィールドは、データベースでデフォルト値で上書きされませんか?

そうは言っても、最善のアプローチは何ですか?

ありがとう!

編集

だから私がつまずいているのはこれです、例えば単純なものを見てみましょうCustomer

1)には、servicesメソッドを呼び出すサービス がありますControllerCustomerServiceGetCustmoerByID

2)Serviceを呼び出してCustomerRepository、オブジェクトを取得しCustomerます。

3) ControllerAutoMapper を使用して を にマッピングしCustomerますViewModel

4)Controllerモデルを に渡しViewます。すべてが素晴らしいです!

ここで、ビューで顧客にいくつかの変更を加え、それをコントローラーにポストして、データベースへの変更を永続化します。

この時点で、オブジェクトは切り離されていると思います。Customerでは、モデルはオブジェクトとまったく同じプロパティを持つべきでしょうか? また、表示したくないアイテムごとに非表示のフィールドを作成して、それらを永続化できるようにする必要がありますか?

オブジェクトをデータベースに保存する方法を教えてください。ビュー/モデルがオブジェクトのいくつかのフィールドのみを扱う場合はどうなりますか?

4

3 に答える 3

5

EF Code First、つまり DbContext API を使用している場合でも、コンテキスト クラスによって処理される変更追跡があります。

オブジェクトに変更を加えた後はSaveChanges()、コンテキストを呼び出すだけで、変更がデータベースに保持されます。

編集

AutoMapper を使用してエンティティの「コピー」を作成しているため、エンティティはコンテキストに関連付けられていません。

あなたができることは、ASP.NET MVCで行うことと似ていると思います( with UpdateModel)。コンテキストから元のエンティティを取得し、ViewModel (変更されたプロパティが含まれている可能性があります) を取得し、古いエンティティを手動で (変更されたプロパティのみ) または AutoMapper を使用して更新できます。そして、を使用して変更を永続化しますcontext.SaveChanges()

別の解決策は、モデル エンティティを ViewModel [の一部] として送信することです。これにより、エンティティがコンテナーにアタッチされ、変更の追跡が引き続き機能します。

お役に立てれば :)

于 2011-04-22T17:08:41.267 に答える
3

デタッチされたオブジェクトを使用すると、デタッチされたエンティティの変更についてコンテキストに通知する責任があることは間違いありません。

基本的なアプローチは、エンティティを変更済みとして設定するだけです。これはスカラーおよび複雑なプロパティでは機能しますが、ナビゲーションプロパティ(FKリレーションを除く)では機能しません-ナビゲーションプロパティの問題について詳しくは、この回答を確認してください(EFv4およびObjectContext APIに関連していますが、DbContext APIでも同じ問題があります) 。このアプローチの欠点は、DBのすべてのフィールドが変更されることです。単一のフィールドを変更するだけの場合でも、他のフィールドに正しく入力する必要があります。そうしないと、データベースレコードが破損します。

どのフィールドが変更されたかを明示的に定義する方法があります。エンティティ全体ではなく、プロパティごとに変更された状態を設定します。一般的なアプローチでこれを解決するのは少し難しいですが、私はEFv4EFv4.1のために何らかの方法を示しようとしました。

于 2011-04-22T17:52:55.990 に答える
1

ビューレベルでモデルエンティティを使用する方がはるかに簡単であるという@AbdouMoumenに同意します。サービス レイヤーは、これらのエンティティをデータ ストア (db) に永続化するための API を提供する必要があります。サービス レイヤーは、リポジトリ 弁護士 (つまり、すべてのエンティティに対して Save(entity) を保存する) を愚かに複製するのではなく、エンティティの集合体に対して高レベルの保存を提供する必要があります。たとえば、在庫、顧客、アカウントなどのより基本的なエンティティを更新する結果となるサービス レイヤーに Save(order) を含めることができます。

于 2012-08-26T04:52:34.043 に答える