ASP.NET Отложенная загрузка MVC 1.0 и Castle ActiveRecord 2.0

#asp.net-mvc #lazy-loading #castle-activerecord

#asp.net-mvc #отложенная загрузка #castle-activerecord

Вопрос:

Как мне получить доступ к отложенному загруженному свойству модели 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) %>
  

Очевидно, что если я не буду ссылаться на свойство в своем контроллере, я получу ошибку области сеанса при попытке вызвать свойство в представлении.

Но мне это кажется неправильным. Есть ли лучший способ инициализации отложенных загруженных свойств модели до перехода к представлению? Я полагаю, я мог бы написать функцию инициализации в модели, но это тоже кажется неудобным.

Комментарии:

1. Я столкнулся с тем же самым с обычным NHibernate. В конечном итоге мне пришлось перенести мою транзакцию в BeginRequest и EndRequest.

2. Ваш комментарий должен быть ответом, mxmissile. Наличие одного sessionScope для каждого запроса решило бы его проблему, хотя вы должны быть осторожны при использовании автоматической очистки.

3. Да, но я не знаком с AR’s sessionScope или AR, если на то пошло, не уверен, что его транзакционное использование такое же, как у обычного NHibernate, другими словами, не чувствовал себя квалифицированным .. 😉

4. Спасибо за ответы, но AR не управляет областями сеанса так же, как NHibernate. В AR вам вообще не нужно управлять областями сеанса, если вы не используете отложенную загрузку.

Ответ №1:

Я обратился к группе 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.

Ответ №2:

Простое решение таково: не выполняйте отложенную загрузку в вашем представлении. Представление в MVC по определению ничего не загружает для бизнеса.

Это зависит от контроллера, чтобы вы могли протестировать это поведение.

И да, вам не нужно устанавливать это в ваших сопоставлениях. Вы можете запрашивать свои объекты с помощью другого режима выборки, чтобы они быстро загружались в этом конкретном случае.

Комментарии:

1. Хотя отмеченный ответ непосредственно соответствует тому, что спрашивал пользователь, это лучший ответ. Представление не должно делать ничего, что касается базы данных.