Пользовательский загрузчик Nhibernate для коллекции - PullRequest
2 голосов
/ 20 июля 2010

Я действительно надеюсь, что кто-то может помочь с этим, пробовал разные комбинации в течение полутора дней ....

В основном у меня есть некоторые иерархические данные, хранящиеся в одной таблице, обычный parentIDсопоставляется со сценарием идентификатора строки.Я смоделировал свойство в доменном объекте, которое возвращает список предков для данного элемента.Кажется, что все работает, просматривая журналы (т.е. извлекает и гидратирует правильные строки:

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

ОДНАКО: коллекция фактически никогда не заполняется, шагая, хотя мой код Ilist не содержит того, что должен- только один экземпляр (такой же, как текущая запись)! ?? В журналах нет ошибок из-за невозможности отобразить возвращенные столбцы, он просто не заполняется правильно? Imконечно, я упускаю что-то очевидное - но просто не могу увидеть это ....

У меня есть объявление коллекции, как это в моем отображении

<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 toвернуть список предков ключевых слов для данного ключевого слова:

<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 Ответ

3 голосов
/ 20 июля 2010

Хорошо, вы просто ненавидите его, когда SO очевидно .....

В основном коллекция была сопоставлена ​​с ключом KeywordId - это означает, что она будет присоединена на основетекущий идентификатор объекта для этого ключа, в возвращенных строках ни у одного из объектов не было бы этого ключа (поскольку все они являются различными объектами).

Поэтому для исправления я добавил новый столбец возврата в именованный запрос с именемOriginalID, который просто возвращает идентификатор, который мы передаем в качестве параметра.Таким образом, коллекции есть что сопоставить:

<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]

Иногда это просто помогает говорить, хотя!

...