【问题标题】:Using Automapper to update an existing Entity POCO使用 Automapper 更新现有实体 POCO
【发布时间】:2012-11-09 19:29:37
【问题描述】:

我正在使用 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() 方法返回 Proxy 而不是 POCO,这会导致 Automapper 报错。如何获取 POCO 而不是 Proxy?
  2. 这是执行更新的最佳做法吗?

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/6156538/…
  • 我认为这还可以,甚至很优雅。您使用了正确的 Mapper.Map 重载。
  • 感谢@Gert Arnold,增加了我对这种方法的信心。

标签: asp.net-mvc entity-framework-4 viewmodel automapper dbcontext


【解决方案1】:

如果你像这样使用 Automapper,它会返回一个新的 Patient 对象,并且不会保留对实体框架图的引用。你必须像这样使用它:

[HttpPost]
public ActionResult Edit(PatientView viewModel)
{
    Patient patient = db.Patients.Find(viewModel.Id); 
    Mapper.Map(viewModel, patient);
    ...
    db.SaveChanges();
    return RedirectToAction("Index");
}

【讨论】:

  • 是的,我相信自从我发布这个问题以来,一个错误已经得到修复,你说明的方法现在可以正常工作了。
【解决方案2】:

似乎有两种方法可以处理 EF 代理问题:

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

注意。后者带有“改进空间。请参阅:Automapper : mapping issue with inheritance and abstract base class on collections with Entity Framework 4 Proxy Pocos”。

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多