6

在我的代码中,我正在加载一个entityusing its id,然后使用它更新它的内容AutoMapper,最后调用Context.SaveChanges. 但它不工作!. 但是当我手动设置属性时它会生效!怎么了 ?

var entity = Context.MyEntities.Find(id);

entity = Mapper.Map<MyEntity>(viewModel);

Context.SaveChanges;

但这一个有效:

var entity = Context.MyEntities.Find(id);

entity.SomeProp = viewModel.SomeProp;

Context.SaveChanges;
4

1 回答 1

12

然后使用 AutoMapper 更新其内容

这不是真的 -Mapper.Map<MyEntity>(viewModel)返回类的新实例MyEntity。它不会更新现有实例的属性。您应该将该新实例附加到上下文:

var entity = Context.MyEntities.Find(id); // this line is useless
entity = Mapper.Map<MyEntity>(viewModel);
Context.MyEntities.Attach(entity);
Context.SaveChanges;

当您创建新实体时,从上下文中检索实体也没有意义。您正在重用相同的变量来保存对不同对象的引用,这令人困惑。真正发生的事情可以这样描述:

var entityFromDb = Context.MyEntities.Find(id);
var competelyNewEntity = Mapper.Map<MyEntity>(viewModel);
Context.MyEntities.Attach(competelyNewEntity);
Context.SaveChanges;

在您的第二个选项中,您正在更新存在于上下文中的实体的属性,您不需要附加它。

顺便说一句,有第三个选项(也是最好的) - 使用另一种映射方法,它会更新目标实体:

var entity = Context.MyEntities.Find(id);
Mapper.Map(viewModel, entity); // use this method for mapping
Context.SaveChanges;
于 2012-11-23T12:37:08.883 回答