2010-08-10 3 views
0

У меня есть 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.

Как я могу достичь того, что я пытаюсь сделать? Или есть альтернативный подход?

ответ

1

NHibernate не знает, когда следует сохранять пользователя и когда сохранять пользователя безопасности. Вам нужно что-то в вашей базе данных, чтобы сообщить NHibernate, когда запись является пользователем, и когда она является пользователем безопасности. Чтобы рассказать вам, как это сделать, мне нужно знать, почему «Это необходимо, чтобы избежать возврата пароля и соли каждый раз, когда мне нужно запрашивать пользователя».? Когда причина в производительности, вы, вероятно, не можете измерить разницу. Если вы используете класс User для сценариев отчетов, вы можете лучше использовать класс прогнозирования для выбора результата запросов для отчетов, чем отображаемый объект.

+0

'SR-43: информация о чувствительности (см. Глоссарий, SR-39) не должна быть доступна при запросе пользователя или списка пользователей.« В принципе, это требование существует для предотвращения опрокидывания по проводам. Поскольку мы используем nHibernate на уровне данных, я хотел бы иметь возможность возвращать пользователя без пароля, сохраняя при этом пароль для регистрации или смены пароля. «SecurityUser» никогда не возвращался через службу и использовался только внутри страны. –

+1

В этом случае вы можете лучше отправлять немые DTO вместо сложных объектов NHibernate по проводке. Количество вопросов о stackoverflow об этом предмете может убедить вас использовать DTO вместо сущностей по проводу. Я не имею в виду, что невозможно сделать хорошее приложение с отправкой объектов по кабелю, но создать его сложнее, чем использовать DTO. С помощью таких инструментов, как automapper, вам нужно только определить DTO, и automapper может автоматически сопоставить вашу сущность с DTO. – Paco

Смежные вопросы