1

情况:假设我在使用 IUserType 在数据库中加密的实体上有一个列:

public class EncryptedStringUserType : IUserType
{

    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        object r = rs[names[0]];
        if (r == DBNull.Value)
            return null;
        return CryptoProvider.Instance.Decrypt((string) r);
    }

    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        object paramVal = DBNull.Value;
        if (value != null)
            paramVal = CryptoProvider.Instance.Encrypt((string) value);
        IDataParameter parameter = (IDataParameter)cmd.Parameters[index];
        parameter.Value = paramVal;
    }

   // Other IUserType members as usual..
}

正如 Ayende 本人解释的那样: http://ayende.com/Blog/archive/2008/07/31/Entities-dependencies-best-practices.aspx

现在查询时,使用 NHibernate IQuery 接口,我需要加密我传递给查询的参数:

query.SetString("DbEncryptedParameter", 
    CryptoProvider.Instance.Encrypt(UnencryptedValueObject.ToString()));

问题:是否有更好的方法来执行此查询,利用 NHibernate 对此加密类型的知识,因此在设置参数时不必执行加密?

4

1 回答 1

0

我错过了什么吗?为什么在发送时需要对值进行加密?IUserType 的要点在于您封装了本机表单(明文)和持久表单(加密)之间的区别。当您向查询提供纯文本版本时,NHibernate 应该调用 IUserType.NullSafeSet 来加密值并将查询参数设置为加密值。

于 2010-10-11T15:25:27.173 回答