web-dev-qa-db-ja.com

Automapperを使用して既存のエンティティPOCOを更新する

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

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

[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. Find()メソッドは、Automapperに文句を言うPOCOではなくプロキシを返します。プロキシの代わりにPOCOを取得するにはどうすればよいですか?
  2. これは更新を実行するためのベストプラクティスですか?
17
Paul Taylor

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

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

EFプロキシの問題に対処するには2つのアプローチがあるようです。

  1. スイッチをオフにしますObjectContext.ContextOptions.ProxyCreationEnabled、アプリケーション全体(EFコンテキストコンストラクターまたはEDMX内)、またはプロキシではなく実際のエンティティオブジェクトの取得を保証する必要があるクエリのいずれか。
  2. Automapperの拡張機能を使用して、ここに記載されています: https://Gist.github.com/935461

注意。後者は「改善の余地があります。参照: Automapper:Entity Framework 4 Proxy Pocosを使用したコレクションの継承と抽象基本クラスのマッピングの問題 "。

1
Paul Taylor