我真的希望有人可以帮忙解决这个问题,现在已经尝试了一天半的各种组合....
基本上我有一些存储在单个表中的分层数据,通常的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>
我已经在我已经花了很长时间在这上面撕裂头发,所以任何帮助都会非常感激!!
答案 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]
有时它只是说话有帮助!