2009-09-04 46 views
1

如何從視圖內訪問ActiveRecord模型的延遲加載屬性?ASP.NET MVC 1.0和Castle ActiveRecord 2.0懶加載

我有一個消息模型屬於一個類別型號,兩者都被標記爲懶惰=真

我能夠做訪問延遲加載的特性,我認爲在我的控制器

以下
using (new SessionScope()) 
{ 
    results = _service.FindAllNews(start, pageSize, new[] { Order.Asc("Id") }); 
    foreach (var result in results) 
    { 
     var category = result.Category; 
    } 
} 
return View(results); 

然後在我看來,我通過結果分析和處理以下

<%= Html.Encode(item.Category.Title) %> 

顯然顯示類別標題,如果我不引用屬性我在我的控制器中,當試圖調用視圖中的屬性時,會出現會話範圍錯誤。

但這對我來說似乎是錯誤的。在到達視圖之前是否有更好的方式來初始化模型的延遲加載屬性?我想我可以在模型中編寫一個Init函數,但是這看起來也不錯。

+1

我用普通的NHibernate碰到了同樣的事情。我不得不最終將我的事務移到BeginRequest和EndRequest。 – mxmissile 2009-09-04 20:49:40

+0

你的評論應該是一個答案,mxmissile。每個請求有一個SessionScope可以解決他的問題,但是如果使用自動刷新,則必須小心。 – wtaniguchi 2009-09-04 20:51:40

+0

是的,但我不熟悉AR的SessionScope或AR,不知道它是否屬於常規的NHibernate,換句話說沒有感覺合格...... ;-) – mxmissile 2009-09-04 21:10:45

回答

3

我轉向AR谷歌組,找到了我正在尋找的答案。我想我會在這裏與大家分享,以防別人正在尋找同樣的東西。

要更改會話作用域的創建和銷燬位置,以便使用ActiveRecord進行延遲加載,應將以下內容添加到web.config中。

<system.web> 
    <httpModules> 
     <add 
      name="ar.sessionscope" 
      type="Castle.ActiveRecord.Framework.SessionScopeWebModule, Castle.ActiveRecord" /> 
    </httpModules> 
</system.web> 

這改變被創建並設置以匹配每個請求這裏http://www.castleproject.org/activerecord/documentation/trunk/usersguide/web.html會話範圍會話範圍的位置。

3

簡單的解決方案是:不要在您的視圖中執行延遲加載。根據定義,MVC中的視圖沒有業務加載任何東西。

這是由控制器來做到這一點,所以你可以測試這種行爲。

是的,你不需要在你的映射中設置它。您可以使用另一個Fetchmode查詢您的對象,以便在特定情況下可以快速加載它們。

+0

雖然標記的答案直接是用戶所要求的,但這是更好的答案。該視圖不應該做任何觸及數據庫的事情。 – ConsultUtah 2009-10-15 19:57:23