【问题标题】:EF6. Save exception information to database after rollback transactionEF6。回滚事务后将异常信息保存到数据库
【发布时间】:2020-01-09 20:45:31
【问题描述】:

我需要将有关异常的信息保存到数据库中。

即

SomeMethod() 
{
    try 
    {
         using(transaction = context.beginTransaction())
         {
             try 
             {
                 // here is the database error
                 await transaction.CommitAsync();
             } 
             catch(Exception e)
             {
                 await transaction.Rollback();
                 throw;
             }
         } 
    }
    catch(Exception exception) 
    {
        // Here I get the same error that was generated inside the transaction
        context.Set<LogEntity>().Add(new LogEntity(....));
        await context.SaveChangesAsync();
    } 
}

我是否正确理解上下文是与数据库的连接,并且在一个上下文中我可以执行多个事务?

据我了解,这个阶段的上下文处于脏状态?

发生事务错误后如何写入数据库?

【问题讨论】:

  • 您认为错误不是连接问题?
  • 异常也可能是由于与 DbContext 关联的实体的状态,在这种情况下,对 SaveChanges 的另一个调用将生成相同的异常。我会使用一个新的 DbContext 实例来记录异常,其中异常可能是由 DbContext 生成的。
  • 是的,错误与实体的状态有关。我认为回滚也应该回滚实体的状态。在这个阶段,我创建了一个事务包装器,当我调用回滚方法时,实体的状态被回滚,但我不确定这是什么问题(我最近与 ef 合作过)。

标签: c# entity-framework-6 entity-framework-core


【解决方案1】:

据我了解,这个阶段的上下文处于脏状态?

正确。 “数据库错误”一定是在 SaveChanges(Async) 调用中发生的,因此如果您在同一上下文中重复该调用,异常将再次发生。补救措施很简单:在 catch 块中使用新的上下文。

旁注:没有必要在 using 块中捕获异常。如果事务在处理之前没有提交,它将被回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2019-06-22
    相关资源
    最近更新 更多