升级到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之前有没有人看到过这个错误?
答案 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)
我遇到了这个问题,因为我在同一个表中使用了两个左连接。通过使用子查询而不是其中一个连接来修复它。