не может выполнить отложенную загрузку в n-уровневом веб-приложении - PullRequest
0 голосов
/ 01 декабря 2011

Я использую NH для сопоставления БД с объектом с именем location, который имеет некоторые свойства и в списке <Attachments> вложений (отношение один ко многим с экземпляром lcocation).

Я использую лямбда-выражение для инициализации location istance:

 public IList<T> GetAllByExpression(Expression<Func<T,bool>> expression)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                return session.Query<T>().Where(expression).ToList();
            }
        }

на более позднем этапе кода, который я пытаюсь получить доступ к коллекции location.attachments, но получаю исключение:

{"Initializing[Location#543c7367-08fa-4469-a252-8e2c6163be22]-failed

для ленивой инициализации коллекции ролей: Location.Attachments, ни один сеанс или сеанс не был закрыт "}

Я понимаю, что сеанс закрыт, но я ничего не могу сделать.

Я понимаю, что сессия закрыта, но я ничего не могу поделать.

У меня есть дилемма: 1) Код использует коллекцию после выборки из БД и ему нужно, чтобы сессия все еще оставалась открытой... оставлять сеанс открытым на все время - это плохая практика. (без using).

2) Даже если я оставляю сеанс открытым в течение всего времени выполнения приложения, я создаю n-уровневую сетьприложение. DAL должен быть общим и не подвергать сомСеанс реализации (в данном случае NH).

3) Решение проблемы с загрузкой, похоже, является решением, но оно бесполезно - так как мне придется загружать все данные в случае объекта со списком другихобъекты в нем.(И это может продолжаться даже рекурсивно)

Что мне делать?

TIA

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Психическая отладка по:

Похоже, что вы пытаетесь загрузить коллекцию после закрытия сеанса или пытаетесь загрузить коллекцию в сеансе, отличном от того, который загружал корневую сущность.

Не делай этого.

1 голос
/ 01 декабря 2011

Как предполагает Джейсон, это потому, что вы закрыли сессию.

Если вы используете веб-формы, то вы можете посмотреть на Session Per Request, где сессия открывается в началеHttp-запрос, и закрыт в конце Http-запроса.(глобальный asax для этих событий RequestBegin / RequestEnd)

Это позволит вам выполнять отложенную загрузку.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...