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 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

于 2009-09-07T12:51:20.907 回答
3

简单的解决方案是:不要在视图中执行延迟加载。根据定义,MVC 中的视图没有业务加载任何内容。

这取决于控制器,因此您可以测试此行为。

是的,您不需要在映射中设置它。您可以使用另一种 Fetchmode 查询您的对象,以便在该特定情况下快速加载它们。

于 2009-09-13T17:20:25.130 回答