我正在使用EF Core,逻辑是保存时如果发生任何错误,然后将错误写回数据库。
仅供参考:我正在使用存储库+ UnitOfWork。
方案1 :await _unitOfWork.CommitAsync();
首先在catch块中分离所有有问题且无法保存的实体,然后将新实体添加到错误日志表中,然后通过调用await _unitOfWork.CommitAsync();
工作正常。
方案2 :由于违反await _unitOfWork.ItemRepo.AddAsync(ss);
,发生了PK
错误。
我在这里也与上述相同,首先进行分离然后再次保存,但是await _unitOfWork.CommitAsync();
不会引发任何错误,不会返回受影响的行数,也不会插入数据库中。
这就是为什么我无法弄清楚这里出了什么问题。
编辑:添加源代码
public async Task<int> SaveAsync(List<ItemDTO> items)
{
try
{
var ss = items.Select(x => new Item()
{
No = x.No,
Description = x.Description,
Type = x.Type,
Price = x.Price
});
await _unitOfWork.ItemRepo.AddAsync(ss);
return await _unitOfWork.CommitAsync();
}
catch (Exception e)
{
await SaveErrorAsync(e.Message,"");
throw;
}
}
public async Task<int> SaveErrorAsync(string error, string type)
{
_unitOfWork.DetachAllEntities();
await _unitOfWork.ErrorRepo.AddAsync(new Error()
{
Id = Guid.NewGuid(),
Type = type,
Status = "Failed",
Time = DateTime.UtcNow,
StatusDescription = error
});
return await _unitOfWork.CommitAsync();
}
public void DetachAllEntities()
{
_context.ChangeTracker.Entries().Where(e => e.State == EntityState.Added ||
e.State == EntityState.Modified ||
e.State == EntityState.Deleted).ToList().ForEach(x => x.State = EntityState.Detached);
}
public async Task<int> CommitAsync()
{
return await _context.SaveChangesAsync();
}