流畅的 NHibernate 会话异常处理

fluent NHibernate session exception handling

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

http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-exceptions https://svn.code.sf.net/p/nhibernate/code/trunk/nhibernate/src/NHibernate/ISession.cs

还有很多 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;
        }
    }

但是如果在第一行代码发生错误并引发异常怎么办(当您打开会话时)? None 的例子掩盖了它!

我的一个大学建议采用这种方法:

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() 抛出异常,您不必捕获它并检查 transaction 因为它必须是 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;
          }
        }
    }