У меня есть User
таблицу, определенную так:Как иметь два отображения для одной таблицы в Fluent nHibernate?
CREATE TABLE Users(
UserId int IDENTITY(1,1) NOT NULL,
UserName varchar(128) NOT NULL,
Name nvarchar(200) NOT NULL,
Password binary(64) NOT NULL,
PasswordSalt binary(16) NOT NULL
)
Я пытаюсь иметь два класса, отображающих в этой таблице:
- Первый объект, называемый
User
не имеет пароля и PasswordSalt свойства , - Второй объект, называемый
SecurityUser
, наследует отUser
и определяет свойства Password и PasswordSalt.
Идея заключается в том, что SecurityUser
- это внутренний объект, для которого требуется промежуточная услуга для изменения пароля. Это необходимо, чтобы избежать возврата пароля и соли каждый раз, когда мне нужно запрашивать пользователя.
Класс User
является тем, что я называю безопасным объектом, который не предоставляет никакой информации, чувствительной к пользователю.
Прямо сейчас, я определил две карты:
public class UserMap : ClassMap<User>
{
protected UserMap()
{
Id(x => x.Id);
Map(x => x.UserName);
Map(x => x.Name);
}
}
и
public class SecurityUserMap : SubclassMap<SecurityUser>
{
protected SecurityUserMap()
{
Map(x => x.Password);
Map(x => x.PasswordSalt);
Table("Users");
}
}
Проблема заключается в том, что NHibernate создает таблицу с именем SecurityUser
. Я попытался использовать функцию Table("Users")
, чтобы указать ту же таблицу, но затем получаю недопустимое сопоставление nhibernate.
Как я могу достичь того, что я пытаюсь сделать? Или есть альтернативный подход?
'SR-43: информация о чувствительности (см. Глоссарий, SR-39) не должна быть доступна при запросе пользователя или списка пользователей.« В принципе, это требование существует для предотвращения опрокидывания по проводам. Поскольку мы используем nHibernate на уровне данных, я хотел бы иметь возможность возвращать пользователя без пароля, сохраняя при этом пароль для регистрации или смены пароля. «SecurityUser» никогда не возвращался через службу и использовался только внутри страны. –
В этом случае вы можете лучше отправлять немые DTO вместо сложных объектов NHibernate по проводке. Количество вопросов о stackoverflow об этом предмете может убедить вас использовать DTO вместо сущностей по проводу. Я не имею в виду, что невозможно сделать хорошее приложение с отправкой объектов по кабелю, но создать его сложнее, чем использовать DTO. С помощью таких инструментов, как automapper, вам нужно только определить DTO, и automapper может автоматически сопоставить вашу сущность с DTO. – Paco