19

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. これは、更新を実行するためのベストプラクティスですか?
4

2 に答える 2

63

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

[HttpPost]
public ActionResult Edit(PatientView viewModel)
{
    Patient patient = db.Patients.Find(viewModel.Id); 
    Mapper.Map(viewModel, patient);
    ...
    db.SaveChanges();
    return RedirectToAction("Index");
}
于 2014-08-11T11:34:12.450 に答える
1

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

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

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

于 2012-11-12T09:44:53.733 に答える