NHibernate:访问UserType中的另一列的值

时间:2015-08-20 22:32:54

标签: nhibernate fluent-nhibernate nhibernate-mapping usertype

我试图制作一个散列值的UserType。我遇到的问题是访问位于同一个表中的Salt。

  void IUserType.NullSafeSet(IDbCommand cmd, object value, int index)
    {
        object paramVal = DBNull.Value;

        if (!String.IsNullOrEmpty((string)value))
        {
            paramVal = ComputeHash((string)value, saltBytes?);
        }

        IDataParameter parameter = (IDataParameter)cmd.Parameters[index];
        parameter.Value = paramVal;
    }

我不确定如何可靠地访问同一个表的数据库列以获取已设置的salt。

我可以做这样的事情来访问盐柱:

byte[] saltValueBeingInsertedIntoDB = (IDataParameter)cmd.Parameters[1].Value;

通过索引访问它似乎太脆弱了,因为订单可能会改变。如果我能从列名中访问它,我会喜欢它,但是从不填充列名(SoureColumn)。

如何可靠地访问cmd.Parameters中存在的Salt?或者,还有更好的方法? (除了NHibernate版本之外,我完全可以控制所需的内容。)

注意:如果我在其他地方设置salt,那么我也可以在该位置散列值,而不是使用UserType。

NHiberate 2.1.2.4000 流利的NHibernate 1.1.0.685

1 个答案:

答案 0 :(得分:0)

为解决我的问题,我选择不使用UserType。

相反,我在需要它的对象上创建了一个静态的Ciphering服务实例,然后使用helper属性来获取/设置加密值。这对我很有用。

public class Consumer
{
    static Consumer()
    {
        CipherConsumerSsnService = new CipherConsumerSsnService();
    }

    public static ICipherConsumerSsnService CipherConsumerSsnService { get; set; }

    public virtual long ID { get; private set; }
    public virtual byte[] SSN { get; protected set; }

    public virtual string GetDecryptedSsnOrSetSsnValueAndEncryptIt
    {
        get
        {
            return SSN != null ? CipherConsumerSsnService.Decrypt(SSN) : null;
        }
        set
        {
            SSN = value != null ? CipherConsumerSsnService.Encrypt(value) : null;
        }
    }
}

请注意,此示例并未使用盐,但您应该使用!