使用自动映射器更新现有的实体 POCO



我正在使用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");
}

两个问题:

  1. Find() 方法返回一个代理而不是一个 POCO,这会导致自动映射器抱怨。如何获取 POCO 而不是代理?
  2. 这是执行更新的最佳做法吗?

如果像这样使用 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 代理问题:

  1. 关闭ObjectContext.ContextOptions.ProxyCreationEnabled,无论是整个应用程序(在 EF 上下文构造函数或 EDMX 中),还是需要保证获取实际实体对象而不是代理的查询。
  2. 使用自动映射程序的扩展,记录在此处:https://gist.github.com/935461。

注意。后者评论说"还有改进的余地。请参阅:自动映射器:使用实体框架 4 代理 Pocos 的集合上的继承和抽象基类映射问题"。

相关内容

  • 没有找到相关文章

最新更新