2010-03-08 8 views
2

我們升級到NHibernate 2.1後出現這個錯誤。錯誤:當調用Configuration.BuildSessionFactory()時,「不能同時獲取多個行李」;

[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

我們發現最終的答案...

我們不得不說有超過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> 
+3

在'按代碼映射'中,我們有兩個'bag',其中一個提取類型爲JOIN。感謝您指點我正確的方向! – ps2goat 2014-11-07 19:58:39

+1

很開心一些隨機的東西,我在網上說過幫了一些人:) – 2014-11-25 09:44:45

+0

ps2goat,你是如何解決抓取類型JOIN問題的?我們有一個存儲庫調用,它可以即時構建標準,不幸的是,它在多對多的包上使用JOIN提取。 – neoscribe 2015-06-23 01:48:29

5

另一種替代方法是將集合映射爲集合。 在Nhibernate 4+中,集合集合映射到在.NET 4+中發現的ISet

我發現由於缺少.NET集合集合,因此我使用了很多包映射,現在它已經可用,我可以愉快地改變我的類和映射。

+3

偉大的答案,這應該被評爲更高,因爲它實際上解決了這個問題,如果你想保持渴望加入多個集合! – aeliusd 2015-11-05 15:01:34

0

我有這個問題,因爲我用了兩個左連接到同一個表。通過使用子查詢而不是其中一個連接來修復它。

相關問題