當我用一個一對多的關係,我不斷收到:NHibernate的非唯一的孩子集合急切地加載(一個一對多或多對一的多)
收集不與任何會話相關聯
錯誤加載時急切,並沒有得到任何孩子,如果我加載懶洋洋。
當使用多對多時,我得到了不必要的和錯誤的連接。
的數據方案是這樣的:
項目:
- INT ID(PK)
- 字符串名稱
- INT StorageId(FK寄存,非唯一用法)
存儲(在映射忽略):
- INT ID(PK)
- 字符串名稱
TransporterToStorage(包含信息,不僅鏈接表):
- INT ID(PK)
- INT StorageId(FK存儲)
- INT TransporterId(FK轉運)
- string TransportLineName
轉運(在映射忽略):
- INT ID(PK)
- 字符串名稱
項目應該用C#/ NHibernate類表示,並且包含0-n個條目的附加集合屬性TransportersToStorage
。由於性能方面的原因,我只想將Item.StorageId
映射到TransporterToStorage.StorageId
,並忽略包含兩者的主鍵的Storage
表。
<bag name="TransportersToStorages" ... >
<key property-ref="StorageId" unique="false" ... />
<one-to-many class="TransporterToStorage" column="StorageId" ... />
</bag>
一個一對多似乎違背了一些NHibernate的規則,因爲等於TransporterToStorage
條目可以屬於多個項目。這可能是事故的原因:
收集不與預先加載任何會話
錯誤關聯。
具體的查詢是像(快速僞HQL,但標準究竟做了):
select Item inner join fetch TransporterToStorage tts
where tts.TransporterId = :p1 and tts.StorageId in (:p2, :p3, :p4)
可以在許多一對多或類似的關聯,只有一個完成加入發送到該SQL數據庫?
什麼是最好映射這個?
默認情況下(意思是:根本沒有)懶惰地加載子集合,並在給定的情況下急切地加載子集合。
你能解決這個問題嗎? – 2012-11-09 13:25:41
我放棄了,因爲我正在使用的應用程序幾乎不使用NHibernate對象關係,幾乎不可能在很短的時間內重構它。目前,大多數對象的設計與上面的「Item」類似,只有另一個對象的ID,頂層通過單獨的查詢(以前是原生SQL,越來越多的HQL/Criteria)安排所有加載,相關對象更新,集合等。在不久的將來,改變這可能成爲一項任務。 – 2012-11-09 17:54:02