Почему NHIbernate (Fluent) все еще выполняет запросы для моих свойств Noop?

У меня есть пользовательский объект, который имеет много-много отношений с проектом. В моем отображении пользователя, у меня есть это:

HasManyToMany(x => x.Projects).Table("UsersProjects").ParentKeyColumn("UserID").Access.None();

Когда я запускаю простой запрос get by id:

session.QueryOver<User>()
       .Where(x => x.PrimaryID == id)
       .Take(1).SingleOrDefault();

Я получаю два запускаемых запроса: первый - запрос на получение по идентификатору, второй - запрос на получение списка проектов.

Я думал, что смысл свойства noop заключается в том, что NHibernate может знать об отношениях, но не заполнять это свойство...? Интересно, что свойство Projects после запроса равно нулю, поэтому свойство не устанавливается (что делает второй запрос еще более избыточным!)

Я использую NHibernate v3.1.0.4000 и FluentNHibernate v1.2.0.712

редактировать

Я провел небольшое тестирование и определил, что это не проблема, связанная с использованием интерфейса запросов. Кроме того, когда я выгружаю свои сопоставления в файлы hbm, сопоставление для этого свойства выглядит следующим образом:

<set access="none" name="Projects" table="UsersProjects">
  <key>
    <column name="UserID" />
  </key>
  <many-to-many class="Project">
    <column name="ProjectID" />
  </many-to-many>
</set>

Это выглядит так, как я ожидал ( http://ayende.com/blog/4054/nhibernate-query-only-properties).

2 ответа

Решение

Access=none свойство относится к уровню доступа к коллекции в вашем POCO; не в ваших запросах. (доступ может быть "свойство", "поле", "открытое поле" и т. д.). так что это не имеет никакого отношения к тому, как обрабатывается ваша коллекция.
смотрите здесь и здесь
с помощью lazy=true будет препятствовать загрузке вашей коллекции, пока вы не ссылаетесь на нее (что, как я понимаю, то, что вы хотите).

Я подозреваю, что это взлом, но если я добавлю LazyLoad() к отображению, это предотвратит выполнение второго нежелательного запроса:

HasManyToMany(x => x.Projects).Table("UsersProjects").ParentKeyColumn("UserID").LazyLoad().Access.None();
Другие вопросы по тегам