当我使用一对多的关系时,我会一直得到:
集合与任何会话无关
错误地加载时出错,如果我懒得加载,就不会生孩子。
使用多对多时,我会得到不必要的错误连接。
数据方案如下:
档案:
- int ID(PK)
- string Name
- int StorageId(FK存储,非唯一用途)
存储(在映射中忽略):
- int ID(PK)
- string Name
TransporterToStorage(包含信息,不仅包含链接表):
- int ID(PK)
- int StorageId(FK存储)
- int TransporterId(FK Transporter)
- string TransportLineName
Transporter(在映射中忽略):
- int ID(PK)
- string Name
项目应由C#/ NHibernate类表示,并带有一个额外的集合属性TransportersToStorage
,包含0-n个条目。由于性能原因,我想仅将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,但实际上是使用Criteria完成):
select Item inner join fetch TransporterToStorage tts
where tts.TransporterId = :p1 and tts.StorageId in (:p2, :p3, :p4)
可以在发送到数据库的SQL中只有一个连接完成多对多或类似的关联吗?
最好映射这个?
默认情况下,子集合应该被懒惰地加载(意思是:根本没有),并且在特定情况下急切地加载。
答案 0 :(得分:0)
我怀疑这里遇到会话管理问题,我怀疑你的会话在你访问懒惰/渴望加载的孩子之前就已经关闭了。您可能需要更改管理会话的方式或将父/子加载到DTO中并从方法中返回。
如果不了解更多关于处理会话的方式,则难以获得更明确的答案。