2010-03-31 61 views
1

我使用的是与NHibernate的ASP.NET MVC2,但我面临一个问题。所有通过NHibernate调用数据库应该在事务中,但是在一些情况下,视图内的代码会启动数据库调用。因此,需要能够在视图渲染后提交事务。ASP.NET MVC:查看后运行代码已呈现(关闭数据库事务)

例如显示用户和他们的用户角色的列表,你可以使用此代码显示用户角色:<%:Model.UserRole.Name%>

这将导致数据库作为的UserRole上一炮打响使用NHibernate代理加载。

您可以在这种情况下热切地获取UserRole来避免这个问题,但有些情况下使用延迟加载会快得多。

无论如何,有没有办法在视图渲染后运行代码?

+0

我真的不明白为什么调用对象模型会击中分贝它击败了MVC的全部目的。你能从你的控制器提供一些代码吗? – 2010-03-31 00:27:14

+0

他是正确的:延迟加载会,但这不是问题,它是一个功能。 – 2010-03-31 00:30:43

+0

即使延迟加载,我觉得我们不应该在View中做任何事情来启动数据库连接。我会考虑改变设计。 – ravi 2010-03-31 03:11:50

回答

2

动作过滤器怎么样?

public class CleanUpAttribute: ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     //cleanup code here 
    } 
} 

然后你用这个属性装饰你的控制器。

+0

完美,谢谢。我修改http://weblogs.asp.net/srkirkland/archive/2009/09/03/asp-net-mvc-transaction-attribute-using-nhibernate.aspx以这种方式工作。 – Alistair 2010-03-31 01:09:08

+0

这里没什么可看的.. – Alistair 2010-03-31 21:54:52

3

您是否尝试过使用按会话请求模式?这是在Web环境中处理NHibernate会话的一种非常自然的方式。

当您在“NHibernate session per request”上进行Google搜索时,有许多信息可用,如this blog post

另外,看看伟大的比尔麦克福特的文章NHibernate Best Practices。虽然它是为NHibernate 1.2编写的,但它拥有丰富的信息。虽然在那里,他的S#arp Architecture也看起来很酷:)

+0

谢谢,您还包括我在链接中需要的内容。 – Alistair 2010-03-31 01:09:36