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

问题描述 投票:0回答:1

当尝试修补任务对象时,我收到了您在标题中看到的错误。

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; }
}

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

当存在正在跟踪的实体集合时,就会发生此问题,在这种情况下,任务实体中的问题属性导致了该问题。

entity-framework asp.net-core automapper savechanges
1个回答
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() 就不会抛出异常,并且会写出更改。

© www.soinside.com 2019 - 2024. All rights reserved.