这是我的代码:
public async Task<int> UpdateTransport(int transportId, TransportForUpdateDto transportDto)
{
var transportCheck = await _context.Transport
.Where(t => t.TransportId == transportId)
.Include(t => t.Loadings)
.Include(t => t.Deliveries)
.AsNoTracking()
.FirstOrDefaultAsync();
var loadingsToDelete = transportCheck.Loadings.Where(tc => !transportDto.Loadings.Any(l => l.LoadingId == tc.LoadingId)).ToList();
var deliveriesToDelete = transportCheck.Deliveries.Where(tc => !transportDto.Deliveries.Any(d => d.DeliveryId == tc.DeliveryId)).ToList();
_context.Loading.RemoveRange(loadingsToDelete);
await _context.SaveChangesAsync();
_context.Delivery.RemoveRange(deliveriesToDelete);
await _context.SaveChangesAsync();
var transport = await _context.Set<Transport>().Where(t => t.TransportId == transportId).FirstOrDefaultAsync();
_mapper.Map(transportDto, transport);
return await _context.SaveChangesAsync();
}
这很简单。我只是在检查DB中的对象是否在Dto中作为交货和装载存在。如果没有,我将其删除到数据库中。问题是我遇到了实体框架错误:
无法跟踪实体类型“ Delivery”的实例,因为 键值为'{DeliveryId:19619}'的另一个实例已经存在 被跟踪。附加现有实体时,请确保只有一个 附有具有给定键值的实体实例。
很抱歉,我对Entity Framework缺乏了解。我真的不知道如何解决问题。
编辑:经过多次尝试,我发现只有当我第一次在Postman中调用该路由时,我才会收到错误消息。下一个调用正常,实体已正确更新。 问题来自最后一行:
return await _context.SaveChangesAsync();