Почему NHibernate не в состоянии ленивой загрузки в зависимости от аргумента SetMaxResults? - PullRequest
0 голосов
/ 25 августа 2010

у нас есть отношения один ко многим к одному, которые мы пытаемся реализовать в NHibernate. Это перефразировка вопроса моего коллеги .

Существует Блок с коллекцией GroupPartnerInterests , каждый из которых имеет Company . Следующий метод проверки проходит с SetMaxResults(3), но не с SetMaxResults(5). Исключение составляет

NHibernate.LazyInitializationException: Инициализация [Model.EntityClasses.BaseBlock # 100000121437] -failed лениво инициализировать коллекцию роль: Model.EntityClasses.BaseBlock.GroupPartnerInterests, ни одна сессия не была закрыта.

Вопрос в том, почему аргумент SetMaxResults имеет значение?

Метод испытаний:

[TestMethod]
public void TestGroupPartnerInterests()
{
    using ( ISession session = SessionFactory.OpenSession() )
    {
        IList<Block> blocks = session
            .CreateCriteria( typeof( Block ) )
            .SetMaxResults( 5 ).List<Block>();

        foreach ( var block in blocks )
        {
            TestContext.WriteLine( block.BlockId + " " + block.BlockName );

            if ( block.GroupPartnerInterests != null )
            {
                foreach ( var gpi in block.GroupPartnerInterests )
                {
                    TestContext.WriteLine( gpi.Company.CompanyName );
                }
            }
        }
    }
}

XML-файлы конфигурации:

<class name="Block" table="[BLOCK]">
  <id name="BlockId" column="GA_ID" access="field.camelcase-underscore" >
    <generator class="assigned"/>
  </id>
  ... data properties ...
  <many-to-one name="Contract" access="field.camelcase-underscore" 
               fetch="select" unique="true">
    <column name="EPC_ID"/>
  </many-to-one>
  <many-to-one name="Country" access="field.camelcase-underscore" 
               fetch="select" cascade="none">
    <column name="COUNTRY_ID"/>
  </many-to-one>

  <set name="GroupPartnerInterests" access="field.camelcase-underscore"
       cascade="all-delete-orphan" fetch="select">
    <key property-ref="GroupId">
      <column name="PAR_ID"/>
    </key>
    <one-to-many class="GroupPartnerInterest"/>
  </set>
</class>

<class name="GroupPartnerInterest" table="[GROUP_PARTNER_INTERESTS]">
  <composite-id >
    <key-property name="GroupId" column="PAR_ID" />
    <key-property name="CompanyId" column="PU_ID" />
  </composite-id>
  ... data properties ...
  <many-to-one name="Company" access="field.camelcase-underscore" 
               fetch="select" cascade="none">
    <column name="PU_ID"/>
  </many-to-one>
</class>

<class name="Company" table="[COMPANY]">
  <id name="CompanyId" column="PU_ID" access="field.camelcase-underscore" >
    <generator class="assigned"/>
  </id>
  ... data properties ...
  <set name="GroupPartnerInterests" access="field.camelcase-underscore" 
       cascade="all-delete-orphan" inverse="true" fetch="select">
    <key>
      <column name="PU_ID"/>
    </key>
    <one-to-many class="GroupPartnerInterest"/>
  </set>
</class>

1 Ответ

1 голос
/ 25 августа 2010

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

using(var session = sessionFactory.OpenSession()) 
using(var tx = session.BeginTransaction()) 
{ 
    // execute code that uses the session 
    tx.Commit(); 
} 
...