Справка по исключению ActiveRecord "Не удалось лениво инициализировать коллекцию - нет сеанса" - PullRequest
3 голосов
/ 19 декабря 2008

Я пишу веб-приложение с использованием Castle ActiveRecord и получаю это исключение, когда пытаюсь получить доступ к загруженному списку связанных объектов. Вот мой код:

        using(new SessionScope())
        {
            foreach (var field in eventObj.RegistrationFields)
            {
                //Do something with the field here...
            }
        }

Свойство RegistrationFields выглядит следующим образом:

    [HasMany(Inverse = true, Lazy = true)]
    public IList<EventRegistrationField> RegistrationFields { get; set; }

Исключение возникает при обращении к "eventObj.RegistrationFields" для цикла foreach. Я также удостоверился, чтобы установить атрибут isweb = "true" в моих настройках конфигурации activeRecord. Кто-нибудь знает, почему это произойдет? Вот мой конфиг:

<connectionStrings>
  <add name="main" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=EventScheduler;Integrated Security=SSPI"/>
</connectionStrings>
<activerecord isWeb="true">
  <config>
    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
    <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
    <add key="hibernate.connection.connection_string_name" value="main"/>
  </config>
</activerecord>

Ответы [ 2 ]

6 голосов
/ 22 декабря 2008

Я думаю, вы запутались в сессиях. RegistrationFields является ленивым свойством eventObj. Именно сессия, которая загрузила eventObj, будет отвечать за загрузку RegistrationFields. Вы явно открываете новый сеанс с помощью new SessionScope(), который создает новый сеанс, к которому eventObj не привязан; поэтому не существует собственного сеанса для получения данных. Даже если исходный сеанс еще жив, вызов new SessionScope() вкладывает новый сеанс и скрывает старый, где его нельзя увидеть, пока не будет вызван Dispose() в текущей области. Объекты не будут автоматически присоединяться к текущей сессии. Это ожидаемое поведение NHibernate.

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

Вы можете попробовать перейти к сеансу по запросу (см. Документацию Castle, чтобы узнать, как это сделать) и отменить создание SessionScope. Это сохранит ваши объекты живыми на время запроса страницы (то есть насколько ленивая коллекция должна жить в веб-приложении). Однако вы должны знать, что в этом сценарии любое изменение, которое вы вносите в постоянный объект, будет записано в БД при очистке сеанса (по сути, вы должны рассматривать изменение состояния постоянного объекта как изменение базового объекта). данные, как если бы они были одной и той же операцией - тогда вы не ошибетесь).

1 голос
/ 19 декабря 2008

Когда был загружен eventObj? Это должно быть в сессии тоже. Также ознакомьтесь с разделом ActiveRecord в документации:

...