Экземпляр типа объекта «Вопрос» не может быть отслежен, потому что другой экземпляр этого типа с тем же ключом уже отслеживается - PullRequest
0 голосов
/ 03 декабря 2018

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

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 голосов
/ 03 декабря 2018

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

...