我正在使用带有NHibernate的ASP.NET MVC2,但我遇到了一个问题。通过NHibernate对数据库的所有调用都应该在事务中,但视图中的代码在某些情况下会启动数据库调用。因此,需要能够在呈现视图之后提交事务。
例如,显示用户及其用户角色列表,您可以使用以下代码显示用户角色:<%:Model.UserRole.Name%>
当使用NHibernate代理加载UserRole时,这将导致数据库命中。
在这种情况下,您可以急切地获取UserRole来解决问题,但是在某些情况下使用延迟加载要快得多。
无论如何,有没有办法在视图渲染后运行代码?
答案 0 :(得分:3)
您是否尝试过使用会话请求模式?这是在Web环境中处理NHibernate会话的一种非常自然的方式。
当您针对“每个请求的NHibernate会话”进行Google搜索时,可以获得许多信息,例如this blog post。
另外,请看看Bill McCafferty的文章NHibernate Best Practices。虽然它是为NHibernate 1.2编写的,但它有丰富的信息。在那里,他的S#arp Architecture看起来也很酷:)
答案 1 :(得分:2)
动作过滤器怎么样?
public class CleanUpAttribute: ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
//cleanup code here
}
}
然后用这个属性装饰你的控制器。