2010-01-19 3 views
3

Я использую NHibernate для загрузки некоторых объектов в мое приложение ASP.NET MVC.NHibernate - Lazy-Loading primitive type

Например, представление подается пользователем, и я хочу, чтобы отобразить имя пользователя (но только имя пользователя) пользователя, например:

<%= Html.Encode(item.User.UserName) %> 

Когда я загружаю представление с использованием NHibernate, пользователь загружается из базы данных, что означает, что фактический SQL-запрос (для загрузки пользовательской информации) будет генерироваться и исполняться только при вызове указанной выше строки кода (именно этого я и хочу).

Проблема заключается в том, что SQL-запрос также выбирает другую информацию о пользователе, такую ​​как пароль, электронная почта и т. Д. Эта информация, очевидно, не нужна и отбрасывается.

SQL-запрос выглядит следующим образом:

SELECT id, username, password, email FROM User WHERE Id = 1; 

я делаю вывод, что NHibernate только ленивые нагрузки ссылки на другие объекты, которые отображаются в таблицы в моей базе данных. Это не похоже на ленивые нагрузки базовых, примитивных типов, таких как строки, ints и т. Д.

Могу ли я это сделать? Когда выбрана строка выше, я хотел бы, чтобы SQL-запрос выглядел примерно так:

SELECT username FROM User WHERE Id = 1; 

Возможно ли это? Как?

ответ

1

Есть ли причина, по которой вы не хотите загружать полный объект? За исключением редких случаев, нет реальной разницы в производительности.

Я понимаю, что не хочу загружать пароль в память, хотя он должен быть зашифрован и, вероятно, не должен быть в вашей модели домена. Что бы я делал в вашем случае, это подкласс User на два класса: User и UserProfile (содержащий пароль и т. Д.), Так что вы работаете только с объектом UserProfile при управлении учетной записью пользователя.

0

Вы должны будете использовать resultTransformer для отображения результата запроса к объекту вы хотите сохранить его (как я понимаю, это ваш обычный класс DTO пользователя, но минус все остальные поля)

Проверить это http://docs.jboss.org/hibernate/stable/core/reference/en/html/querysql.html (его Hibernate, а не NHibernate, но он все равно должен применяться), в частности, раздел 16.1.5