(Свободно) Nhibernate ленивая загрузка и влияет на Parallel.ForEach

У меня есть несколько объектов, настроенных через FNH для загрузки дочерних объектов с использованием синтаксиса FetchMode.Eager, когда я запрашиваю экземпляры (из базы данных). Теперь у меня сложилось впечатление, что это будет игнорировать любую ленивую загрузку в сопоставлении и заполнять дочерние объекты «реальными» данными.

Причина, по которой я хочу это сделать, заключается в том, что я хочу использовать Parallel.ForEach для перебора набора сущностей и создания набора результатов, но получаю следующую ошибку:

[18000] System.InvalidOperationException:
There is already an open DataReader associated with this Command 
which must be closed first. 

Если я использую «NHibernateUtil.Initialize» для инициализации всех дочерних объектов, то он работает, как и ожидалось.

Я ошибаюсь в своем понимании использования FetchMode.Eager?


person AwkwardCoder    schedule 06.08.2010    source источник


Ответы (1)


Я действительно никогда не пытался бы сделать это. Каждая функция Parallel.ForEach может работать в другом потоке. В зависимости от вашей конфигурации NHibernate ISession сохраняется в потоке, что означает, что все, кроме вызывающего потока, не может получить доступ к сеансу, поэтому все это терпит неудачу.

Лично я бы извлек все это в объект передачи, а затем выполнил Parallel.ForEach для этого.

person Deleted    schedule 27.03.2011
comment
я все это знаю, отсюда и использование 'NHibernateUtil.Initialize' - person AwkwardCoder; 28.03.2011
comment
Это не имеет значения. Вокруг ваших объектов все еще есть прокси-серверы, которые ожидают присутствия контекста, чего нет, если вы находитесь в другом потоке. - person Deleted; 28.03.2011
comment
Нет, это не так. Я только что попробовал это на прокси NH3 и Castle. Он просто загружает объект. Было бы нелогично не загружать прокси, если на этом объекте есть какие-либо другие агрегаты, которые необходимо инициализировать и т. д. - person Deleted; 29.03.2011