2010-03-31 59 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