2009-09-04 20 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

+0

あなたのコメントは答え、mxmissileでなければなりません。要求ごとに単一のSessionScopeを持つことで問題は解決しますが、自動フラッシュを使用する場合は注意が必要です。 – wtaniguchi

+0

そうですが、私はARのSessionScopeやARには慣れていませんが、transacitonの使用法が通常のNHibernateと同じであるかどうかわかりません。言い換えれば、修飾されていないと感じました。;-) – mxmissile

答えて

3

私はAR googleグループに目を向けると、私が探していた答えが見つかりました。私は他の誰かが同じことを探している場合には、ここで皆と共有すると思いました。

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のビューには何もロードされていません。

この動作をテストするにはコントローラを使用する必要があります。

はい、マッピングに設定する必要はありません。その特定のケースで熱心に読み込まれるように、別のフェッチ・モードでオブジェクトを照会することができます。

+0

マークされた回答はユーザーが尋ねてきたものですが、これはより良い答えです。ビューは、DBに触れるものを実行すべきではありません。 – ConsultUtah