C# fluent NHibernate会话异常处理

C# fluent NHibernate会话异常处理,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,在会话期间应如何处理NHibernate异常?互联网上有很多例子: 还有许多StackOwerflow线程建议采用类似的方法: using (ISession session = factory.OpenSession()) using (ITransaction tx = session.BeginTransaction()) { try { // do some work ...

在会话期间应如何处理NHibernate异常?互联网上有很多例子:

还有许多StackOwerflow线程建议采用类似的方法:

using (ISession session = factory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
    {
        try
        {
            // do some work
            ...
            tx.Commit();
        }
        catch (Exception e)
        {
            if (tx != null) tx.Rollback();
                throw;
        }
    }
但是如果发生错误并且在代码的第1行抛出异常(当您打开会话时),该怎么办?没有一个例子能掩盖它

我的一所学院提出了这种方法:

ITransaction transaction = null;
    try
    {
        using (ISession session = databaseFacade.OpenSession())
        {
            transaction = session.BeginTransaction();
            //do some work
            ...

            transaction.Commit();
        }
    }
    catch (Exception ex)
    {
        if (transaction != null)
            transaction.Rollback();

        throw new Exception(ex.Message);
    }

我建议解耦那些

  • 公开会议
  • 执行数据库操作
使用这种方法,您可以在第一行中保留处理
OpenSession()
异常的逻辑,以后不用担心。原因是,如果(像您的情况一样)
databaseFacade.OpenSession()
抛出异常,您不必捕获它并检查
事务,因为它必须为
null

    //if OpenSession() throws it's fine , not transaction at all
    using (ISession session = databaseFacade.OpenSession())
    {
        using (ITransaction tx = session.BeginTransaction())
        {
          try
          {
              // do some work
              ...
              tx.Commit();
          }
          catch (Exception e)
          {
            //tx is not null at this point
            tx.Rollback();
            throw;
          }
        }
    }

如果OpenSession()抛出异常,则事务不会发生,这是正确的,但是如何处理该异常呢?在您的代码示例中,try-catch块不会处理它。还是我遗漏了什么?@SomeGuy如果
OpenSession
失败,就没有什么可处理的了,因为还没有创建任何内容。实际上,您应该做的唯一一件事是重新显示异常,因为最有可能的应用程序将无法工作