nhibernate - отключить автоматическую \ отложенную загрузку дочерних записей для одного-многих отношений - PullRequest
9 голосов
/ 20 октября 2008

Хотелось бы узнать, есть ли способ отключить автоматическую загрузку дочерних записей в nHibernate (для одного: много отношений).

Мы можем легко отключить ленивую загрузку свойств, но я хочу отключить любой вид автоматической загрузки (ленивый и не ленивый оба). Я хочу загружать данные только с помощью запроса (например, HQL или критерии)

Я все же хотел бы определить отношения между родительскими дочерними записями в файле отображения, чтобы облегчить HQL и иметь возможность присоединения родительских дочерних объектов, но я не хочу, чтобы дочерние записи загружались как часть родительской записи, если только запрос на родительскую запись прямо заявляет, что (через нетерпеливую выборку и т. д.).

Пример: Извлечение записей отдела из базы данных не должно извлекать все записи сотрудников из базы данных, потому что это может никогда не понадобиться.

Один из вариантов здесь - установить коллекцию Employees в Отделе как ленивую загрузку. Проблема с этим подходом состоит в том, что, как только объект передается вызывающему API, он может «коснуться» свойства отложенной загрузки и получить весь список из БД.

Я пытался использовать 'evict' - чтобы отключить объект, но, похоже, он не работает постоянно и не выполняет глубокое выселение объекта. Кроме того, он абстрагирует ленивый загруженный тип свойства с прокси-классом, который позже приводит к хаосу в коде, где мы пытаемся воздействовать на объект с помощью отражения, и встречает неизрасходованный тип объекта.

Я новичок в nHibernate, любые указатели или помощь будут очень полезны.

Ответы [ 2 ]

3 голосов
/ 23 октября 2008

По вашему запросу вы просто не можете сопоставлять «Отдел» с «Сотрудниками» или иметь свойство «Сотрудники» в своем отделе. Это будет означать, что вам всегда приходится совершать попадания в базу данных, чтобы найти сотрудников базы данных.

Аплоги, если эти примеры кода не работают "из коробки", я сейчас не рядом с компилятором

Итак, ваш класс отдела может выглядеть так:

 public class Department 
 { 
     public int Id { get; protected set; }
     public string Name { get; set; }
     /* Equality and GetHashCode here */
 }

и ваш сотрудник будет выглядеть так:

 public class Employee
 { 
     public int Id { get; protected set; }
     public Name Name { get; set; }
     public Department Department { get; set; }
     /* Equality and GetHashCode here */
 }

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

/*...*/
session.CreateCriteria(typeof(Employee))
    .Add(Restrictions.Eq("Department", department)
    .List<Employee>();

Если ваша спецификация гласит: «В департаментах много сотрудников», это не значит, что вы должны сопоставить ее как двунаправленную ассоциацию. Если вы можете сохранить связанную однонаправленную связь, вы действительно сможете получить доступ к данным для полетов.

Google Совокупность "доменного дизайна" или дополнительную информацию можно найти на странице 125 книги Эрика Эвана о доменном дизайне

0 голосов
/ 20 октября 2008

Вы можете иметь ленивый атрибут в коллекции. В вашем примере, у Отдела есть n сотрудников, если ленивый включен, сотрудники не будут загружаться по умолчанию при загрузке отдела: http://www.nhforge.org/doc/nh/en/#collections-lazy

У вас могут быть запросы, которые явно загружают сотрудников отдела и сотрудников. Это опция «выборки»: http://www.nhforge.org/doc/nh/en/#performance-fetching-lazy

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