当尝试修补任务对象时,我收到了您在标题中看到的错误。
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; }
}
在互联网上搜索了多个小时后,我确实设法修复了它,答案是针对由其他原因引起的相同错误的一些答案的组合。由于我找不到问题的确切答案,因此我自己在这里做了一个,以防将来有人遇到同样的问题。
当存在正在跟踪的实体集合时,就会发生此问题,在这种情况下,任务实体中的问题属性导致了该问题。
如果您像我一样调用 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() 就不会抛出异常,并且会写出更改。