IUserType对应Int64与ODP.net

时间:2011-01-21 21:48:09

标签: c# oracle nhibernate odp.net

我们有一个自定义类型,它主要对应于System.Int64,它用于我们的系统标识符(它为底层长值提供了一些额外的约束)。

我们还定义了一个IUserType,允许我们使用NHibernate映射此类型的属性,但是当针对oracle数据库运行时,我们遇到了所谓的"Int/Decimal Problem"

用户类型(获取/设置)的相关部分位于:

public object NullSafeGet(IDataReader rs, string[] names, object owner) {
    var longValue = Convert.ToInt64(NHibernateUtil.Int64.NullSafeGet(rs, names[0]));
    return new Identifier(longValue);
}

public void NullSafeSet(IDbCommand cmd, object value, int index) {
    if (value == null || ((Identifier)value).IsNew) {
        NHibernateUtil.Int64.NullSafeSet(cmd, null, index);
        return;
    }
    NHibernateUtil.Int64.NullSafeSet(cmd, ((Identifier)value).Value, index);
}

当我们尝试保存包含标识符属性的任何东西时,我们当前从ISession的SaveOrUpdate方法获得了无效的强制转换异常。

是否有一种好的(甚至可以正常的)方式来处理这个问题的方式同时适用于oracle和SQL Server,或者我们是否需要创建两个不同的UserType实现?

1 个答案:

答案 0 :(得分:1)

经过一些调查后,问题可能出现在sequence-identity generation strategy上。它试图使用这样的查询:

INSERT INTO my_entity (id, name) 
VALUES (hibernate_sequence.nextval, :p0) 
returning id into :nhIdOutParam

使基于序列的身份与SQL服务器上的身份相同(允许使用单个查询进行插入和ID检索)。我猜测外面的参数是十进制的,这就是我遇到问题的地方。

切换到“本机”生成策略它正在运行,但我仍然希望听到有关此问题的任何其他见解。