需要帮助了解Nhibernate事务以及如何避免重复代码(如果可能)

需要帮助了解Nhibernate事务以及如何避免重复代码(如果可能),nhibernate,c#-4.0,transactions,Nhibernate,C# 4.0,Transactions,我理解您应该始终使用事务。我还看到NHibernate.ITransaction实现了一个Dispose,所以我需要将我的ITransaction对象包装在using语句中。那么,这是否意味着对于每个非只读存储库方法,即更新、编辑。。。我必须声明: using (ITransaction _transaction = _session.BeginTransaction(//isolationlevel)) { //procedure code here } 有没有一种方法可以让我把这个包起

我理解您应该始终使用事务。我还看到NHibernate.ITransaction实现了一个Dispose,所以我需要将我的ITransaction对象包装在using语句中。那么,这是否意味着对于每个非只读存储库方法,即更新、编辑。。。我必须声明:

using (ITransaction _transaction = _session.BeginTransaction(//isolationlevel)) {
  //procedure code here
}
有没有一种方法可以让我把这个包起来我看不出来我可以

另外,我是否最好在Try/Catch中包装session.SaveOrUpdate方法和transaction.Commit

using (_transaction = _session.BeginTransaction(IsolationLevel.ReadCommitted) {
  try {
    _session.SaveOrUpdate(entity);
      try {
        _transaction.Commit();
      catch (//some exception ex) {
        _transaction.RollBack();
      }
  }
  catch (//some exception ex) {
    //log ex
  }
}
或者有没有更好的方法,比如将会话和事务方法放在同一个try/catch中


谢谢,

我会避免在这样的存储库中对事务进行微观管理。为什么在使用NHibernate或任何其他ORM时,将数据库语义添加到存储库不是一个好主意。最好的做法是为您的业务逻辑实现一个事务管理器。

我不想在这样的存储库中对事务进行微观管理。为什么在使用NHibernate或任何其他ORM时,将数据库语义添加到存储库不是一个好主意。最佳实践是为您的业务逻辑实现一个事务。当直接使用ISession时,建议的实践是:即使对于读取,也应该使用事务

using(var session = factory.OpenSession())
using(var tx = session.BeginTransaction())
{
    // all the code that uses the session goes here
    // use session to load and/or save entity
}
这基本上是创建一个工作单元

根据您的操作上下文web请求、wcf请求,您可能希望将所有操作都包含在单个工作单元中。有关web请求,请参阅有关WCF操作的信息,请参阅

同样正如Sixto Saez所说,调用SaveOrUpdate是一种气味。在大多数情况下,您有以下两种情况之一:

1创建新实体并调用会话。Saveentity


2使用get/Load或通过查询从会话中获取一个或多个实体,修改该实体,更改将由nhibernate在会话处理时保存。除非您更改会话刷新模式,但这不是重点。

直接使用ISession时,建议的做法是:即使在读取时也应使用事务

using(var session = factory.OpenSession())
using(var tx = session.BeginTransaction())
{
    // all the code that uses the session goes here
    // use session to load and/or save entity
}
这基本上是创建一个工作单元

根据您的操作上下文web请求、wcf请求,您可能希望将所有操作都包含在单个工作单元中。有关web请求,请参阅有关WCF操作的信息,请参阅

同样正如Sixto Saez所说,调用SaveOrUpdate是一种气味。在大多数情况下,您有以下两种情况之一:

1创建新实体并调用会话。Saveentity

2使用get/Load或通过查询从会话中获取一个或多个实体,修改该实体,更改将由nhibernate在会话处理时保存。除非您更改会话刷新模式,但这不是重点