我有一个Project
对象,它由许多嵌套对象组成。
将此对象保存到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,因此它可以理解上述内容 - 或者手动映射所有内容是否更好? (很多工作,在我的情况下)
答案 0 :(得分:2)
首先清除目标集合。如果要映射到现有EF集合,则需要AutoMapper.Collection。
答案 1 :(得分:1)
这是因为在映射时,会创建新实体,并且EF上下文没有任何关于它的信息。 您可以将数据从数据库映射到您已更改的项目'做所有必要的更改然后再次映射到' existingProject'并为此实体致电'更新'方法如下例所示(使用System.Data.EntityState.Modified) Updating records using a Repository Pattern with Entity Framework 6