NHibernate ленивая загрузка отношения один ко многим, когда уже загружен - PullRequest
0 голосов
/ 15 сентября 2009

У меня есть дерево, где каждый узел является классом ресурса:

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

Небольшой недосмотр, он только выдает дополнительные выборки при перечислении дочерних коллекций конечных узлов в дереве ...

1 Ответ

0 голосов
/ 15 сентября 2009

Либо сделайте это:

<bag ... lazy="false">

чтобы всегда получать предметы или делать это (на HQL):

var resources = session.CreateQuery("from Resource r join fetch r.ChildResources");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...