Не удается задать для свойства nhibernate-ref для свойства "один ко многим" свойство, отличное от первичного ключа

Я получаю это исключение ТОЛЬКО при установке свойства-ref в моем XML-файле.

При инициализации [Domain.Entities.R#12345] не удалось лениво инициализировать коллекцию ролей: Domain.Entities.R.LP, ни один сеанс или сеанс не был закрыт

LP.hbm.xml
----------
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain.Entities" assembly="Domain">

<class name="LP" table="LP">
  <id name="Id">
    <column name="Id" sql-type="int" not-null="true"/>
  </id>

  <property name="AnotherField"/>
  <property name="PaymentDate"/>
  <property name="PaymentAmount"/>
</class>

</hibernate-mapping>


R.hbm.xml
---------
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain.Entities" assembly="Domain">
<class name="R" table="R">
<id name="Id">
  <column name="Id" not-null="true"/>
</id>

<property name="AnotherField"/>

<set name="LP">
  <key column="AnotherField" property-ref="AnotherField" />
  <one-to-many class="Domain.Entities.LP" not-found="ignore" />
</set>
</class>
</hibernate-mapping>

        IQueryable<Entities.R> query = _db.Query<Entities.R>();

        var query2 = _db.Query<Entities.LP>().ToList();

        var queryResults = query.ToList();

        Iesi.Collections.Generic.ISet<Entities.LP> lp; 
        try
        {
            lp = queryResults.First().LP;   <--- this fails with exception
        }
        catch (Exception ex) 
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            var lp2 = _db.Query<Entities.LP>().Take(100); <-- works just fine
        }

Что я не понимаю, так это почему lp2 настроен нормально, но lp не работает? Я знаю, что модель данных не идеальна, но сейчас мне нужно с ней работать. Если я удаляю свойство ref из файла xml в nhprof, я вижу, что он вызывает таблицы SQL (с неверным значением, поэтому я не получаю данных обратно), но это не дает сбоя. Это происходит только тогда, когда у меня установлено свойство-ref.

Любая помощь будет принята с благодарностью. Это мой первый запуск с NH.

1 ответ

Сообщение об ошибке дает вам ответ. Ваш набор объектов LP в классе R загружен по умолчанию. Это означает, что вам нужно получить доступ к коллекции LP в течение сеанса.

Как правило, вы делаете это, получая ISessionFactory и вызывая OpenSession в блоке using. Получите доступ к коллекции в блоке using, и все будет в порядке.

Другие вопросы по тегам