1

ビュー内からActiveRecordモデルの遅延ロードされたプロパティにアクセスするにはどうすればよいですか?

カテゴリモデルに属するニュースモデルがあり、どちらもLazy=trueとマークされています

コントローラで次の手順を実行することで、ビューで遅延ロードされたプロパティにアクセスできます

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関数を記述できると思いますが、それも不安定なようです。

4

2 に答える 2

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で、リクエストごとのセッションスコープに一致するようにセッションスコープが作成および破棄される場所が変更されます

于 2009-09-07T12:51:20.907 に答える
3

簡単な解決策は次のとおりです。ビュー内で遅延読み込みを実行しないでください。定義によるMVCのビューには、何もロードするビジネスはありません。

この動作をテストできるように、それを行うのはコントローラー次第です。

はい、マッピングでそれを設定する必要はありません。オブジェクトを別の Fetchmode でクエリして、その特定のケースで積極的にロードすることができます。

于 2009-09-13T17:20:25.130 に答える