NHibernate非独特的子集合急切地加载(一对多或多对多)

时间:2012-02-09 16:20:25

标签: nhibernate join many-to-many one-to-many eager-loading

  • 当我使用一对多的关系时,我会一直得到:

      

    集合与任何会话无关

    错误地加载时出错,如果我懒得加载,就不会生孩子。

  • 使用多对多时,我会得到不必要的错误连接。

数据方案如下:

  

档案:

     
      
  • 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中只有一个连接完成多对多或类似的关联吗?

最好映射这个?

默认情况下,子集合应该被懒惰地加载(意思是:根本没有),并且在特定情况下急切地加载。

1 个答案:

答案 0 :(得分:0)

我怀疑这里遇到会话管理问题,我怀疑你的会话在你访问懒惰/渴望加载的孩子之前就已经关闭了。您可能需要更改管理会话的方式或将父/子加载到DTO中并从方法中返回。

如果不了解更多关于处理会话的方式,则难以获得更明确的答案。