阻止Nhibernate更新特定列?

时间:2011-03-16 15:21:10

标签: c# nhibernate passwords entity hash

我正在使用NHibernate编写一个3层应用程序,其中帐户密码在数据库中保存为哈希。

表示层调用一个save方法,该方法需要一个帐户实体,在我的服务中,在将密码提供给存储库之前对其进行哈希处理。

因此,第一次保存帐户时,密码会被正确哈希,一切都很好。

但是,一旦我必须更新帐户,而不更改密码,帐户实体中的密码属性的值已经过哈希处理,当它通过我的服务的save方法传递时,它将再次进行哈希处理。 / p>

我的实体看起来像这样:

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; }
}

我的服务使用save方法:

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 个答案:

答案 0 :(得分:2)

我建议以不涉及NHibernate层的方式解决这个问题。只需将“首次创建”操作(需要散列)与“一般保存任何更新”操作(不需要散列)分开。

例如,向您的AccountService添加Create()方法,以便第一次创建帐户,该方法可以执行散列并委派给Save()。然后,通用Save()可以正常持久保存对象。

您还可以添加一种持久更改密码的方法,该方法可以通过哈希运行新请求的密码并调用Save()

答案 1 :(得分:1)

您可以使用会话拦截器并使用OnSave函数重新设置原始值的属性值