Ошибка: «Не удается одновременно извлечь несколько пакетов» при вызове Configuration.BuildSessionFactory (); - PullRequest
3 голосов
/ 08 марта 2010

Мы получаем эту ошибку после обновления до NHibernate 2.1.

[QueryException: Cannot simultaneously fetch multiple bags.]
   NHibernate.Loader.BasicLoader.PostInstantiate() +418
   NHibernate.Loader.Entity.EntityLoader..ctor(IOuterJoinLoadable persister, String[] uniqueKey, IType uniqueKeyType, Int32 batchSize, LockMode lockMode, ISessionFactoryImplementor factory, IDictionary`2 enabledFilters) +123
   NHibernate.Loader.Entity.BatchingEntityLoader.CreateBatchingEntityLoader(IOuterJoinLoadable persister, Int32 maxBatchSize, LockMode lockMode, ISessionFactoryImplementor factory, IDictionary`2 enabledFilters) +263
   NHibernate.Persister.Entity.AbstractEntityPersister.CreateEntityLoader(LockMode lockMode, IDictionary`2 enabledFilters) +26
   NHibernate.Persister.Entity.AbstractEntityPersister.CreateLoaders() +57
   NHibernate.Persister.Entity.AbstractEntityPersister.PostInstantiate() +1244
   NHibernate.Persister.Entity.SingleTableEntityPersister.PostInstantiate() +18
   NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners) +3261
   NHibernate.Cfg.Configuration.BuildSessionFactory() +87

Не входя в источник NHibernate, не похоже, что я вижу, какое отображение создает проблему.

Это очень старое приложение с множеством файлов сопоставлений, во многих сопоставлениях есть пакеты «один ко многим», все экземпляры ленивые.

Например:

    <bag name="Ownership" lazy="true" cascade="all" inverse="true" outer-join="auto" where="fkOwnershipStatusID!=6">
        <key column="fkStakeHolderID"/>
        <one-to-many class="StakeholderLib.Ownership,StakeholderLib" />
    </bag>

отображается на:

public virtual IList Ownership {
        get {
            if (ownership == null)
                ownership = new ArrayList();
            return ownership;
        }
        set { ownership = value; }
    }    

Кто-нибудь видел эту ошибку раньше при обновлении до NHibernate 2.1?

Ответы [ 3 ]

8 голосов
/ 18 июня 2015

Другой альтернативой является сопоставление коллекций как набора. В Nhibernate 4+ коллекция наборов сопоставляется с ISet, найденным в .NET 4 +

Я обнаружил, что использовал много отображений сумок из-за отсутствия коллекции наборов в .NET, теперь, когда она доступна, я могу с радостью менять свои классы и сопоставления.

3 голосов
/ 17 марта 2010

Мы нашли ответ в конце концов ...

У нас было существо, у которого было более 1 мешка со связями многие ко многим, у которого было

outer-join="true"

комплект.

Это вызвало ошибку, потому что, когда вы устанавливаете извлечение внешнего соединения, вы обычно делаете это, чтобы ограничить циклические обходы БД, позволяя nHibernate получить всю ассоциацию за 1 выбор. В этом случае это приведет к предварительной загрузке каждой сумки, что немедленно приведет к ошибке.

Мы изменили это на external-join = "auto" (как показано ниже), и они перестали быть предварительно извлеченными. Это остановило nHibernate, пытаясь получить несколько пакетов одновременно.

<bag name="Groups" lazy="true" cascade="none" table="dbname..tablename">
    <key column="foreignkeyname" />
        <many-to-many class="classname.typename,assemblyname"
                column="foreignkeyname" outer-join="auto" />
</bag>
0 голосов
/ 30 июня 2017

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

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