无法跟踪实体类型“ Question”的实例,因为已经跟踪了具有相同键的该类型的另一个实例

时间:2018-12-02 22:27:42

标签: entity-framework asp.net-core automapper savechanges

尝试修补任务对象时,我在标题中看到此错误。

Mission mission = await context.Missions.Include(m => m.Position)
                    .Include(m => m.Questions).ThenInclude(q => q.Answers)
                    .SingleOrDefaultAsync(m => m.MissionId == missionViewModel.MissionId);

                if (mission != null)
                {
                    mapper.Map(missionViewModel, mission);
                    await context.SaveChangesAsync();//gives error
                    return Created($"/api/missions/{mission.MissionId}",
                        mapper.Map<Mission, MissionViewModel>(mission));
                }

public class Mission
{
    [Key]
    public int MissionId { get; set; }
    public string Name { get; set; }
    public Position Position { get; set; }
    public ICollection<Question> Questions { get; set; }
}

在互联网上搜索了多个小时之后,我确实设法修复了该问题,答案是由其他原因引起的相同错误的一些答案的组合。由于我无法找到确切的问题答案,因此我在这里做了自己,以防将来有人遇到同样的问题。

当跟踪到一个实体的集合时,就会发生此问题,在这种情况下,任务实体中的问题属性是导致此问题的原因。

1 个答案:

答案 0 :(得分:0)

如果像我一样在调用SaveChanges()时遇到此错误,那么以下解决方案适用于我的情况:

Mission mission = await context.Missions.Include(m => m.Position).AsNoTracking()
                    .Include(m => m.Questions).ThenInclude(q => q.Answers)
                    .SingleOrDefaultAsync(m => m.MissionId == missionViewModel.MissionId);

                if (mission != null)
                {
                    mapper.Map(missionViewModel, mission);
                    context.Update(mission);
                    await context.SaveChangesAsync();
                    return Created($"/api/missions/{mission.MissionId}",
                        mapper.Map<Mission, MissionViewModel>(mission));
                }

首先,请注意第一行上的“ .AsNoTracking()”,这将停止跟踪对象更改,然后在通过从视图模型映射到对象本身完成更改之后,使用Update()进行跟踪该对象在SaveChanges()之前更改,这样SaveChanges()不会引发异常,并且会写出更改。