我正在使用EF4 DbContext为ASP.NET MVC应用程序提供模型。我使用ViewModels为视图和Automapper提供数据,以执行EF POCO和ViewModel之间的映射。 Automapper做得很好,但在将ViewModel发回控制器进行更新后,我不清楚使用它的最佳方法。
我的想法是使用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");
}
两个问题:
答案 0 :(得分:42)
如果你像这样使用Automapper,它会返回一个新的Patient对象,并且不会保留对enity框架图的引用。你必须像这样使用它:
[HttpPost]
public ActionResult Edit(PatientView viewModel)
{
Patient patient = db.Patients.Find(viewModel.Id);
Mapper.Map(viewModel, patient);
...
db.SaveChanges();
return RedirectToAction("Index");
}
答案 1 :(得分:1)
处理EF代理问题似乎有两种方法:
ObjectContext.ContextOptions.ProxyCreationEnabled
,或者在需要保证获取实际实体对象而不是代理的查询时关闭{{1}}。请注意。后者的评论是“改进空间。见:Automapper : mapping issue with inheritance and abstract base class on collections with Entity Framework 4 Proxy Pocos”。