мешает Nhibernate от обновления определенного столбца? - PullRequest
0 голосов
/ 16 марта 2011

Я пишу 3-уровневое приложение, использующее NHibernate, где пароли учетных записей сохраняются в виде хэша в базе данных.

Уровень представления вызывает метод сохранения, который требует сущность учетной записи, в моей службе, гдепароль хешируется перед передачей в хранилище.

Итак, при первом сохранении учетной записи пароль корректно хешируется и все в порядке.

Но как только мне нужно обновить учетную запись, не меняя пароль, значение паролясвойство в объекте учетной записи уже хэшируется, когда оно проходит через метод сохранения моего сервиса, оно снова хэшируется.

Моя сущность выглядит следующим образом:

public class AccountEntity : EntityBase {
    public virtual string Username { get; set; }
    public virtual string Password { get; set; }
    public virtual string Email { get; set; }
    public virtual bool Enabled { get; set; }
}

И мойСлужба с методом сохранения:

public class AccountService {
    private readonly IRepository<AccountEntity> _accountRepository;
    private readonly IHashingProvider _hashingProvider;

    public AccountService(IRepository<AccountEntity> accountRepository, IHashingProvider hashingProvider) {
        _accountRepository = accountRepository;
        _hashingProvider = hashingProvider;
    }

    public void Save(AccountEntity accountEntity) {
        accountEntity.Password = _hashingProvider.Hash(accountEntity.Password);
        _accountRepository.Save(accountEntity);
    }
}

Как я могу сказать NHibernate НЕ обновить пароль?Какие еще возможности у меня есть?

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Я бы посоветовал заняться этим так, чтобы это не касалось слоя NHibernate. Просто отделите операцию «первое создание» (которая требует хеширования) от операции «общее сохранение любых обновлений» (которая не требует хеширования).

Например, добавьте метод Create() в AccountService для первого создания учетной записи, который может выполнять хэширование и делегировать Save(). Генерал Save() может просто сохранить объект в обычном режиме.

Вы также можете добавить метод для сохранения смены пароля, который может запускать запрошенный пароль через хеш и вызывать Save().

1 голос
/ 16 марта 2011

Вы можете использовать перехватчик сеанса и работать с функцией OnSave, чтобы повторно установить значение свойства в исходное значение

...