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