将DbContext.SaveChanges异常记录到实体框架/实体框架核心

时间:2018-02-20 08:27:07

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

在我的asp.net核心Web应用程序中,我将异常记录到数据库中。到目前为止一切正常但问题是当try块中的DbConext.SaveChanges抛出异常时,无法将异常记录到DbConext.SaveChanges中的catch block数据库也会抛出相同的异常。

这是我到目前为止尝试过的代码:

try
{
    _unitOfWork.Repository<Product>().InsertEntity(product);
     await _unitOfWork.SaveChangesAsync();//This throws exception due the model validation failure
}
catch (Exception exception)
{
    ExceptionModel exceptionModel = new ExceptionModel();
    using (MyDbContext dbContext = new MyDbContext())
    {
        await dbContext.ExceptionModels.AddAsync(exceptionModel);
        await dbContext.SaveChangesAsync(); // Throws the same exception that was thrown in try block due to entity framework transaction
    }
}

注意:我认为问题是由于实体框架事务造成的。

请帮助我如何克服这种情况将异常记录到数据库中。谢谢!

2 个答案:

答案 0 :(得分:1)

在Entity框架Core中,我使用EF-Core Transaction

轻松解决了这个问题
try
{
    _unitOfWork.Repository<Product>().InsertEntity(product);
     await _unitOfWork.SaveChangesAsync();//This throws exception due the model validation failure
}
catch (Exception exception)
{
    ExceptionModel exceptionModel = new ExceptionModel();

    string connectionString = _configuration.GetConnectionString("MyConnection");

    var options = new DbContextOptionsBuilder<MyDbContext>()
                .UseSqlServer(new SqlConnection(connectionString))
                .Options;

    using (var dbContext = new MyDbContext(options))
    {
         using (var transaction = dbContext.Database.BeginTransaction())
         {
             try
             {
                   dbContext.Exceptions.Add(exceptionModel);
                   await dbContext.SaveChangesAsync();
                   transaction.Commit();
             }
             catch (Exception e)
             {
                 Console.WriteLine(e);
                 throw;
             }
         }
     }
}

答案 1 :(得分:1)

在try块中,您正在向db context添加一些更改。保存时会遇到一些异常,并在catch块中使用相同的db上下文来记录该异常。这里的db上下文仍然在try块中进行了未保存的更改。因此,在保存上下文时,您将获得相同的异常。

为避免这种情况,您必须在添加更多更改之前丢弃catch块中db上下文中的更改。

private void ResetContextState() => _context.ChangeTracker.Entries()
.Where(e => e.Entity != null && e.state == EntityState.Added).ToList()
.ForEach(e => e.State = EntityState.Detached);

编辑:上面的代码对我有用。