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

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

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

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

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

Я получаю два запускаемых запроса - первый - это запрос ксделайте get by id, второй запрос для получения списка проектов.

Я думал, что смысл свойства 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 ]

1 голос
/ 26 августа 2011

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

0 голосов
/ 26 августа 2011

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

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