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