分离后Context.SaveChangesAsync()不起作用

时间:2020-04-30 21:26:57

标签: c# entity-framework-core

我正在使用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();            
}

0 个答案:

没有答案