Почему 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();