使用Automapper更新现有的实体POCO(Using Automapper to update

2019-07-03 16:58发布

我使用EF4的DbContext提供一个ASP.NET MVC应用程序模型。 我使用的ViewModels提供数据的意见和Automapper执行EF波苏斯和的ViewModels之间的映射。 Automapper做了伟大的工作,但我不清楚最好的方式来使用它的视图模型发布后回控制器来进行更新。

我的想法是使用包含在视图模型一键搞定POCO对象。 然后我想用Automapper从视图模型数据更新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. 查找()方法返回代理而不是POCO引起Automapper抱怨。 我如何获得的,而不是POCO代理的?
  2. 是进行更新此最佳实践?

Answer 1:

如果你使用Automapper这样,它返回一个新病人的对象和对enity框架图中的引用不会保留。 你必须使用这样的:

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


Answer 2:

似乎有两种方法来处理与EF代理发行:

  1. 关闭ObjectContext.ContextOptions.ProxyCreationEnabled ,无论是对整个应用程序(在EF上下文构造或EDMX),或在您需要确保获得一个实际的实体对象,而不是代理查询。
  2. 使用扩展到Automapper,这里记载: https://gist.github.com/935461 。

注意。 后者与评价“有待改进见: Automapper:映射问题与继承和抽象基类与实体框架4个代理波苏斯集合 ”。



文章来源: Using Automapper to update an existing Entity POCO