19

我正在使用 EF4 DbContext 为 ASP.NET MVC 应用程序提供模型。我使用 ViewModel 向视图提供数据,并使用 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");
}

两个问题:

  1. Find() 方法返回一个代理而不是一个导致 Automapper 抱怨的 POCO。如何获取 POCO 而不是 Proxy?
  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 代理问题:

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

笔记。后者被评论为“有改进的空间。请参阅:Automapper:使用 Entity Framework 4 Proxy Pocos 在集合上继承和抽象基类的映射问题”。

于 2012-11-12T09:44:53.733 回答