#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. Хотя отмеченный ответ непосредственно соответствует тому, что спрашивал пользователь, это лучший ответ. Представление не должно делать ничего, что касается базы данных.