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つの質問:
このようにAutomapperを使用すると、新しいPatientオブジェクトが返され、エンティティフレームワークグラフへの参照は保持されません。あなたはそれをこのように使わなければなりません:
[HttpPost]
public ActionResult Edit(PatientView viewModel)
{
Patient patient = db.Patients.Find(viewModel.Id);
Mapper.Map(viewModel, patient);
...
db.SaveChanges();
return RedirectToAction("Index");
}
EFプロキシの問題に対処するには2つのアプローチがあるようです。
ObjectContext.ContextOptions.ProxyCreationEnabled
、アプリケーション全体(EFコンテキストコンストラクターまたはEDMX内)、またはプロキシではなく実際のエンティティオブジェクトの取得を保証する必要があるクエリのいずれか。注意。後者は「改善の余地があります。参照: Automapper:Entity Framework 4 Proxy Pocosを使用したコレクションの継承と抽象基本クラスのマッピングの問題 "。