IQuery NHibernate - мне нужно шифровать параметр, который является зашифрованным IUserType? - PullRequest
1 голос
/ 04 мая 2010

Ситуация : предположим, у меня есть столбец на объекте, который зашифрован в базе данных с использованием 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..
}

Как объяснил сам Айенде в: http://ayende.com/Blog/archive/2008/07/31/Entities-dependencies-best-practices.aspx

Теперь при запросе, используя интерфейс NHibernate IQuery, мне нужно зашифровать параметр, который я передаю в Запрос:

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

Вопрос : Есть ли лучший способ выполнить этот запрос, используя знания NHibernate об этом зашифрованном типе, поэтому шифрование не нужно выполнять при установке параметра?

1 Ответ

0 голосов
/ 11 октября 2010

Я что-то упустил? Зачем вам нужно шифровать значение при отправке? Суть IUserType заключается в том, что вы инкапсулируете разницу между собственной формой (открытым текстом) и постоянной формой (зашифрованной). Когда вы предоставляете в запросе текстовую версию, NHibernate должен вызвать IUserType.NullSafeSet, чтобы зашифровать значение и установить для параметра запроса зашифрованное значение.

...