NHibernate:访问 UserType 中另一列的值

NHibernate: Access another column's value in a UserType

我正在尝试制作一个散列值的 UserType。我遇到的问题是获取位于同一 table.

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

我不确定如何可靠地访问相同table的数据库列以获取设置的盐。

我可以像这样访问盐列:

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

通过索引访问它似乎很脆弱,因为顺序可能会改变。如果我可以通过列名访问它,我会很高兴,但列名 (SoureColumn) 从未被填充。

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

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

NHiberate 2.1.2.4000 流利的 NHibernate 1.1.0.685

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

相反,我在需要它的对象上创建了我的加密服务的静态实例,然后使用助手 属性 来 get/set 加密值。这对我很有用。

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

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