У меня есть дерево, где каждый узел является классом ресурса:
public abstract class Resource
{
public virtual Guid Id { get; set; }
public virtual Resource Parent { get; set; }
public virtual IList<Resource> ChildResources { get; set; }
}
Как вы можете видеть, этот класс абстрактный, и есть много разных производных классов от Resource (3 на данный момент, еще больше).
В моей базе данных есть таблица ресурсов и таблица для каждого класса,
происходит от ресурса. Они сопоставлены вместе с <joined-subclass>
.
Я прочитал это:
http://ayende.com/Blog/archive/2009/08/28/nhibernate-tips-amp-tricks-efficiently-selecting-a-tree.aspx
и у меня тот же код, что и у Ayende для загрузки моего дерева:
var resource = UnitOfWork.Current.Session
.CreateQuery("from Resource r join fetch r.ChildResources")
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.SetReadOnly(true)
.List<Resource>();
, который работает нормально (все Ресурсы возвращаются с одним выбором). Однако, я вижу дополнительные выборки, когда я перечисляю список ChildResources Ресурса.
Это из-за этого ?:
http://ayende.com/Blog/archive/2009/09/03/answer-the-lazy-loaded-inheritance-many-to-one-association-orm.aspx
В любом случае, как мне предотвратить это?
Вот часть отображений для отношений (имен классов
обрезано для наглядности):
<bag cascade="save-update" fetch="join" lazy="false" inverse="true" name="ChildResources">
<key>
<column name="Parent_Id" />
</key>
<one-to-many class="Resource" />
</bag>
<many-to-one class="Resource" name="Parent">
<column name="Parent_Id" />
</many-to-one>
Спасибо
UPDATE
Небольшой недосмотр, он только выдает дополнительные выборки при перечислении дочерних коллекций конечных узлов в дереве ...