Экземпляр типа сущности "Вопрос" не может быть отслежен, потому что другой экземпляр этого типа с тем же ключом уже отслеживается

При попытке исправить объект миссии я получил эту ошибку, которую вы видите в заголовке.

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 ответ

В случае, если вы получаете эту ошибку, когда вы вызываете 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() не сгенерирует исключение и запишет изменения.

Другие вопросы по тегам