【发布时间】:2012-02-09 16:20:24
【问题描述】:
-
当我使用一对多关系时,我不断得到:
集合不与任何会话关联
急切加载时出错,如果我延迟加载,则不会得到任何子节点。
当使用多对多时,我得到了不必要的错误连接。
数据方案是这样的:
项目:
- int ID (PK)
- 字符串名称
- int StorageId(FK 存储,非唯一用法)
存储(在映射中忽略):
- int ID (PK)
- 字符串名称
TransporterToStorage(包含信息,不仅仅是链接表):
- int ID (PK)
- int StorageId(FK 存储)
- int TransporterId (FK Transporter)
- 字符串 TransportLineName
Transporter(在映射中忽略):
- int ID (PK)
- 字符串名称
项目应由 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 中的一个联接来完成多对多或类似的关联吗?
什么是最好的映射?
默认情况下,子集合应该延迟加载(意思是:根本不加载),并且在给定的情况下急切地加载。
【问题讨论】:
-
你能解决这个问题吗?
-
我放弃了,因为我正在使用的应用程序很少使用 NHibernate 对象关系,而且几乎不可能在短时间内全部重构。目前,大多数对象的设计类似于上面的“项目”,只有另一个对象的 ID,并且顶层通过单独的查询(以前是原生 SQL,越来越多的 HQL/Criteria)安排所有加载、相关对象的更新、集合等。在不远的将来改变这一点可能成为一项任务。
标签: nhibernate join many-to-many one-to-many eager-loading