错误:调用Configuration.BuildSessionFactory()时“无法同时获取多个包”

时间:2010-03-08 18:56:46

标签: c# .net nhibernate

升级到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 个答案:

答案 0 :(得分:8)

另一种选择是将集合映射为集合。 在Nhibernate 4+中,集合集合映射到.NET 4 +中的ISet

我发现由于.NET中缺少一个集合,我使用了很多包映射,现在它已经可用了,我可以愉快地改变我的类和映射。

答案 1 :(得分:3)

我们最终找到了答案......

我们有一个实体拥有超过1个包含多对多关系的实体

outer-join="true"

集。

这导致了错误,因为当您设置外连接提取时,通常这样做是为了限制数据库往返,使nHibernate能够在1选择中检索整个关联。在这种情况下,这将导致每个包上的预取,立即导致错误。

我们将其更改为outer-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>

答案 2 :(得分:0)

我遇到了这个问题,因为我在同一个表中使用了两个左连接。通过使用子查询而不是其中一个连接来修复它。