Nhibernate 如何在单个请求中提交和启动新事务?

Nhibernate 如何在单个请求中提交和启动新事务?,nhibernate,Nhibernate,我正在nhibernate中使用存储库模式。 在asp.net mvc应用程序中。 我有一个httpmodule,它: beginRequest it calls session.beginTransaction(); EndRequest it calls session.Transaction.Commit(); 这在95%的情况下都是好的 我有一个案例,我需要在一个请求中执行以下操作: List<User> users = factory.getUsers(); // up

我正在nhibernate中使用存储库模式。 在asp.net mvc应用程序中。 我有一个httpmodule,它:

beginRequest it calls session.beginTransaction();
EndRequest it calls session.Transaction.Commit();
这在95%的情况下都是好的

我有一个案例,我需要在一个请求中执行以下操作:

List<User> users = factory.getUsers();

// update users

// commit transaction

// load users from the db again
我知道这是反对使用存储库模式以及在HttpModule中启动/结束会话的原因之一,但无论如何,我就是这样做的:)

我有什么选择

升腾 基本上我现在有:

页面请求如下所示:

BeginRequest:  Session.BeginTransaction();

userlist.aspx:   
               // code to fetch users from the db
               // update users
               Session.Transaction.Commit();
               Session.BeginTransaction();
               // code to fetch recently commited users form db

EndRequest:    Session.Transaction.Commit();
上面的说法正确吗


我想在调用commit并重新开始之前,我还应该首先检查是否存在当前事务?

您有两条逻辑

List<User> users = factory.getUsers();

// update users
你想让它们在单独的交易中。因此,您添加了适当的开始和提交。行得通,问题出在哪里

使会话在一个时间段内开始/结束 HttpModule,但无论如何,这就是我 我在做:)我有什么选择

讨论的重点是在HttpModule中是否有会话开始和结束?好吧,你的选择是不这样做!您有一个逻辑块(这里允许使用非常简单的逻辑),它可能是可重用的,所以请将其移动到自己的类中。你觉得吃点东西更好吗

客户端代码:

  useSomeLogic() // bzzzt forgot to start session

  startSession()
  useSomeLogic()  // ok thank you, I can work, but please remember to commit
  commit()

我喜欢包装得很好的可重用代码,这就是为什么我要从特定于传输的模块中重构东西

load users
  useSomeLogic() // bzzzt forgot to start session

  startSession()
  useSomeLogic()  // ok thank you, I can work, but please remember to commit
  commit()
  useSomeLogic() // just fine, I'll start the session and do you work for you and commit