情况:假设我在使用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的参数:
query.SetString("DbEncryptedParameter",
CryptoProvider.Instance.Encrypt(UnencryptedValueObject.ToString()));
问题:有没有更好的方法来执行此查询,利用NHibernate对此加密类型的知识,因此在设置参数时不必执行加密?
答案 0 :(得分:0)
我错过了什么吗?为什么在发送时需要加密值? IUserType的要点是你封装了原生形式(明文)和持久形式(加密)之间的差异。当您向查询提供纯文本版本时,NHibernate应该调用IUserType.NullSafeSet来加密该值并将查询参数设置为加密值。