2010-11-24 2 views
0

У меня есть такой сценарий:Nhinerbate отложенной загрузки эталонного объекта

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

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

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

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

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

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

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

Мои вопросы:

  1. Как я сделать LazyLoad работу здесь?
  2. Могу ли я привести объекты A и объекты B в один запрос?

Спасибо,

ответ

3

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

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

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

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

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

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

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

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

<one-to-many fetch-size="20" ...> 
+0

@Tom: Это неправда. Существует * anohter * пакетный размер, который можно установить в конфигурации и использовать пакетную обработку ADO.NET. Это делает NH создавать партии при очистке сеанса, для операторов обновления и вставки. Он доступен только для Sql Server. (См. Http://ayende.com/Blog/2006/09/16/BatchingSupportInNHibernate.aspx). Но размер пакета, о котором я говорю, предназначен для запросов и независим от базы данных. – 2010-11-30 06:53:55

0

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

ClassMap<T> BatchSize(int size) 

Sets the query batch size for this entity. 

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

Смежные вопросы