流畅的 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;
}
}
}
在会话期间应如何处理 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;
}
}
}