使用AutoMapper映射后,Context不会更新加载的实体

moh*_*sti 3 c# entity-framework automapper ef-code-first

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

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

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

Context.SaveChanges;
Run Code Online (Sandbox Code Playgroud)

但是这个有效:

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

entity.SomeProp = viewModel.SomeProp;

Context.SaveChanges;
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 7

然后使用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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

BTW有第三个选项(并且最好) - 使用另一种映射方法,它更新目标实体:

var entity = Context.MyEntities.Find(id);
Mapper.Map(viewModel, entity); // use this method for mapping
Context.SaveChanges;
Run Code Online (Sandbox Code Playgroud)

  • 惊人的 。谢谢,关于 AutoMapper 行为的评分,第三个选项按预期工作。 (2认同)