实体框架“已经被跟踪

时间:2020-03-20 14:44:57

标签: c# entity-framework-core automapper asp.net-core-webapi dto

这是我的代码:

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();

0 个答案:

没有答案