11

私はEF4 DbContextを使用してASP.NET MVCアプリケーションのモデルを提供しています。 ViewModelsを使用してビューにデータを提供し、AutomapperはEF POCOとViewModels間のマッピングを実行します。 Automapperは素晴らしい仕事をしていますが、ViewModelをコントローラにポストバックしてアップデートを実行した後で、それを使う最良の方法はわかりません。Automapperを使用して既存のEntity POCOを更新する

私の考えは、ViewModelに含まれているキーを使ってPOCOオブジェクトを取得することです。私は、その後のViewModelからのデータをPOCOを更新するためにAutomapperを使用したい:

[HttpPost] 
public ActionResult Edit(PatientView viewModel) 
{ 
    Patient patient = db.Patients.Find(viewModel.Id); 
    patient = Mapper.Map<ViewModel, Patient>(viewModel, patient); 
    ... 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

2つの質問:

  1. 検索()メソッドはAutomapperが文句を原因とPOCOのではなく、プロキシを返します。プロキシの代わりにPOCOを取得するにはどうすればよいですか?
  2. 更新を実行するこのベストプラクティスはありますか?
+0

これは役立つかもしれません:あなたはこのようにそれを使用する必要が http://stackoverflow.com/questions/6156538/entityframework-get-object-by-id – Dmitry

+0

私は、これはOK、エレガントでもあると思います。 'Mapper.Map'の正しいオーバーロードを使用します。 –

+0

ありがとう@ガートアーノルド、そのアプローチへの私の信頼を高めた。 –

答えて

30

このようなAutomapperを使用すると、新しいPatientオブジェクトが返され、エンティティフレームワークグラフへの参照は保持されません。

[HttpPost] 
public ActionResult Edit(PatientView viewModel) 
{ 
    Patient patient = db.Patients.Find(viewModel.Id); 
    Mapper.Map(viewModel, patient); 
    ... 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 
+0

はい、私はこの質問を投稿してからバグが修正され、あなたが今説明した方法が正しく動作すると信じています。 –

1

EFプロキシの問題に対処するには、2つの方法があるように思われる:(EFコンテキストコンストラクタまたはEDMXで)アプリケーション全体のために、またはのためにどちらか、ObjectContext.ContextOptions.ProxyCreationEnabledオフ

  1. スイッチプロキシではなく実際のEntityオブジェクトを取得する必要があるクエリです。
  2. Automapperへの拡張機能を使用して、ここに記載されています:https://gist.github.com/935461

注意。後者は「改善のための部屋参照:Automapper : mapping issue with inheritance and abstract base class on collections with Entity Framework 4 Proxy Pocos」とコメントされています。

関連する問題