AutoMapper 混淆了 ChangeTracker

FBr*_*t87 4 c# entity-framework automapper entity-framework-6

我有一个Project对象,它由许多嵌套对象组成。

将此对象保存到数据库:

  • 我仅更改项目中的一个属性(作为测试),并将其传递给我的 DAL。
  • 我使用 EF 从数据库加载现有项目。
  • 我将更改的项目映射到现有项目。
var existingProject = 
    db.Project.Single(p => p.ID == changedProject.ID).Include(p => p.Something);

existingProject = Mapper.Map(changedProject, existingProject);

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

由于外键为空,这失败了,这并不奇怪,因为当我深入研究更改跟踪器时,我可以看到它非常混乱:

var added = db.ChangeTracker.Entries().Where(e => e.State == EntityState.Added);
Run Code Online (Sandbox Code Playgroud)

映射发生后,项目中的大量对象被标记为“已添加”(即使项目中没有添加或删除任何内容,我只更改了一个属性)。

这是因为 AutoMapper 创建嵌套对象的新实例,而 EF 无法将它们与数据库中的现有对象关联吗?

我在很多地方都看到了这种方法的建议,有没有一种方法可以让 AutoMapper 与 ChangeTracker 一起工作,以便它理解上述内容 - 或者最好手动映射所有内容?(就我而言,有很多工作)

Luc*_*anu 5

首先清除目标集合。如果要映射到现有 EF 集合,则需要 AutoMapper.Collection。