AutoMapper会混淆ChangeTracker

时间:2017-08-09 12:07:59

标签: c# entity-framework entity-framework-6 automapper

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

将此对象保存到DB:

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

existingProject = Mapper.Map(changedProject, existingProject);

db.SaveChanges();

由于null外键导致失败,这并不奇怪,因为当我钻进更改跟踪器时,我发现它非常混乱:

var added = db.ChangeTracker.Entries().Where(e => e.State == EntityState.Added);

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

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

我已经在很多地方看到过这种方法,AutoMapper是否有办法使用ChangeTracker,因此它可以理解上述内容 - 或者手动映射所有内容是否更好? (很多工作,在我的情况下)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这是因为在映射时,会创建新实体,并且EF上下文没有任何关于它的信息。 您可以将数据从数据库映射到您已更改的项目'做所有必要的更改然后再次映射到' existingProject'并为此实体致电'更新'方法如下例所示(使用System.Data.EntityState.Modified) Updating records using a Repository Pattern with Entity Framework 6