我正在使用EF4 DbContext为 ASP.NET MVC应用程序提供模型。我使用 ViewModels 向视图提供数据,并使用 Automapper 来执行 EF POCO 和 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");
}
两个问题:
- Find() 方法返回一个代理而不是一个 POCO,这会导致自动映射器抱怨。如何获取 POCO 而不是代理?
- 这是执行更新的最佳做法吗?
如果像这样使用 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");
}
似乎有两种方法可以处理 EF 代理问题:
- 关闭
ObjectContext.ContextOptions.ProxyCreationEnabled
,无论是整个应用程序(在 EF 上下文构造函数或 EDMX 中),还是需要保证获取实际实体对象而不是代理的查询。 - 使用自动映射程序的扩展,记录在此处:https://gist.github.com/935461。
注意。后者评论说"还有改进的余地。请参阅:自动映射器:使用实体框架 4 代理 Pocos 的集合上的继承和抽象基类映射问题"。