我们有一个自定义类型,它主要对应于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实现?
答案 0 :(得分:1)
经过一些调查后,问题可能出现在sequence-identity generation strategy上。它试图使用这样的查询:
INSERT INTO my_entity (id, name)
VALUES (hibernate_sequence.nextval, :p0)
returning id into :nhIdOutParam
使基于序列的身份与SQL服务器上的身份相同(允许使用单个查询进行插入和ID检索)。我猜测外面的参数是十进制的,这就是我遇到问题的地方。
切换到“本机”生成策略它正在运行,但我仍然希望听到有关此问题的任何其他见解。