Ленивая загрузка эталонного объекта - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть такой сценарий:

class A
{
    public virtual int Id { get; set; }
    public virtual B Child { get; set; }
}

class B
{
    public virtual int Id { get; set; }
}

В отображении класса A у меня есть ссылка на класс B:

map.Reference(a => a.Child).LazyLoad();

Теперь, когда я делаю что-то вроде:

Session.Query<TypeOfA>().Select(a => a);

Помимо обычного выбора * из ATable, я получаю n выборок из BTable для каждой строки A. Это как ленивая загрузка не работает.

Мои вопросы:

  1. Как мне заставить работать ленивец здесь?
  2. Можно ли объединить объекты A и B в одном запросе?

Спасибо,

Ответы [ 2 ]

3 голосов
/ 24 ноября 2010

Ленивая загрузка включена по умолчанию и должна реально работать.Если возникнет проблема, например, если он не сможет сгенерировать прокси для класса B, он будет жаловаться при создании фабрики сеансов.

Вы уверены, что запросы для B выполняются самим запросом, а не для последующего доступа к A?

Вы можете оптимизировать доступ к B двумя способами: получить их вместе сА в одном запросе.(Я не знаю свободно, это способ xml для его настройки:)

<many-to-one fetch="join" ...>

Это имеет некоторые проблемы при использовании со списками и может также сильно взорвать ваш запрос.Это, конечно, не ленивая загрузка.

Другая, очень приятная и мощная оптимизация - это пакетная загрузка.Он позволяет извлекать экземпляры в отдельных запросах, но выбирает сразу несколько из них.

<class name="B" batch-size="20" ...>

Это приведет к одновременному извлечению 20 B в одном запросе.Также доступно для списков:

<one-to-many fetch-size="20" ...>
0 голосов
/ 02 декабря 2010

В дополнение к предложению Stafan использовать пакетный размер, быстрый поиск в Google показывает, что Fluent NHibernate теперь поддерживает BatchSize для запросов.Из документов:

ClassMap<T> BatchSize(int size) 

Sets the query batch size for this entity.

Никогда не использовал его сам, и документация минимальна (как много FNH), но, возможно, вы можете найти пример кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...