Nhibernate 如何在单个请求中提交和启动新事务?
我正在nhibernate中使用存储库模式。 在asp.net mvc应用程序中。 我有一个httpmodule,它: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
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