Nhibernate定制装载机用于收集

时间:2010-07-20 06:34:01

标签: c# nhibernate collections loader bag

我真的希望有人可以帮忙解决这个问题,现在已经尝试了一天半的各种组合....

基本上我有一些存储在单个表中的分层数据,通常的parentID映射到行id方案。我已在域对象中建模了一个属性,该属性返回给定项的祖先列表。这一切似乎都在查看日志(即它检索和保湿正确的行:

CollectionLoadContext - 4 collections were found in result set for role: Domain.Keyword.Ancestors
CollectionLoadContext - 4 collections initialized for role: Domain.Keyword.Ancestors

但是:集合实际上从未实际填充过,虽然我的代码中的Ilist不包含它应该包含的内容 - 只有一个实例(与当前记录相同)!日志中有没有错误,无法映射返回的列,它似乎没有正确填充?我确定我错过了一些明显的东西 - 但是看不到它......

我的映射

中有这样的集合声明
<bag name="Ancestors" inverse="true"cascade="none" lazy="true" fetch="select" generic="true" >
  <key column="KeywordID"/>
  <one-to-many class="Domain.Keyword, BS.Core" />
  <loader query-ref="CustomAncestorLoader"  />
</bag>

... 以及一个名为query的自定义加载器,用于返回给定关键字的关键字祖先列表:

<sql-query name="CustomAncestorLoader">
<load-collection alias="Ancestors" role="Domain.Keyword.Ancestors"/>

SELECT  s.KeywordID, s.kwdhier, s.Keyword, s.Notes, s.position , s.ParentKeywordId
From dbo.utKeywordBranch(:ParentID) k join Keywords s on k.KeywordId = s.[KeywordID] </sql-query>

我已经在我已经花了很长时间在这上面撕裂头发,所以任何帮助都会非常感激!!

1 个答案:

答案 0 :(得分:3)

好吧,当你的 SO 显而易见的时候,你不是唯一讨厌它吗

基本上该集合被映射到一个名为KeywordId的键 - 意味着它将基于该键上的当前对象id进行连接,在返回的行中,没有任何对象具有此键(因为它们都是不同的对象)。

为了解决这个问题,我在命名查询中添加了一个名为OriginalID的新返回列,它只返回我们作为参数传入的ID。这样集合就可以映射到:

<bag name="Ancestors" inverse="true" cascade="none" lazy="true"  fetch="select" generic="true" >
  <key column="OriginalID"/>
  <one-to-many class="Domain.SubjectKeyword, BS.Core" />
  <loader query-ref="CustomAncestorLoader"    />
</bag>

    

SELECT k.OriginalId, s.KeywordID, s.kwdhier, s.Keyword, s.Notes, s.position , s.ParentKeywordId
From dbo.uKeywordBranch(:Id) k join KATKeywords s on k.KeywordId = s.[KeywordID]

有时它只是说话有帮助!