Почему отложенная загрузка NHibernate связана с сеансом? - PullRequest
4 голосов
/ 01 октября 2009

Используя Castle ActiveRecord, я столкнулся с проблемой при отложенной загрузке.

Следующие работы (очевидно)

using (new SessionScope())
{
    User singleUser = User.FindFirst(...)
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

Поскольку мне нужно изменить фильтры сеанса в определенном контексте (используя перехватчики), я создаю новый SessionScope.

using (new SessionScope())
{
    User singleUser;
    EnableVariousFiltersInThisThread();
    using (new SessionScope())
    {
        singleUser = User.FindFirst(...);
    }
    DisableVariousFiltersInThisThread();
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

Последняя строка «singleUser.Groups» выдает исключение LazyInitializationException: «не удалось лениво инициализировать коллекцию ролей: Группы, ни один сеанс или сеанс не был закрыт».

Однако все остальные сеансовые операции работают правильно. Таким образом, кажется, что «singleUser» связан с теперь расположенным SessionScope. Зачем? И как это можно решить альтернативно?

Ответы [ 2 ]

4 голосов
/ 01 октября 2009

Я считаю, что именно так работает NHibernate.

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

Внутренняя сфера ничем не отличается от внешней; он также не поддерживает отложенную загрузку вне этой области.

Однако вы можете обойти это ограничение, если вы обманываете NHibernate в стремительную загрузку в своей внутренней области видимости. Либо позвоните по номеру .ToList() или подобному для коллекций, с которыми вы хотели бы работать, прежде чем выходить из области действия, и данные также будут доступны за пределами.

0 голосов
/ 01 октября 2009

My GUESS - часть причины связана с «Identity Map». Не только лениво загруженные объекты, но и все объекты привязаны к сеансу. Это гарантирует, что никакие два объекта не представляют одну строку в базе данных.

...