这是在 hibernate.org 论坛和 nhuusers 列表上发布的,但运气不佳,所以我想我会在这里尝试。
简单地说,假设我有一堂课:
class A
{
public virtual object SomeValue { get; set; }
}
SomeValue 的类型基本上在 .NET IConvertible 类型集(原语如 bool、byte、char、int16、double、float 等),加上 byte[] 和 string。
我正在尝试为 A 创建一个休眠映射以反映这一点 - 这样我基本上可以将 SomeValue 设置为任意对象(上述类型之一)并稍后检索它。然后,我的 applogic 将对其进行反思以找到类型并做出相应的行为。
到目前为止,我已经尝试创建 IUserType 的实现来尝试处理这个问题。但是我不知道为 SqlType[] SqlTypes 返回什么。我考虑过 new SqlType(DbType.Object) 但是当我尝试从中生成模式时,我得到一个 System.ArgumentException: Dialect does not support DbType.Object
如果我尝试另一种数据类型,那么在尝试转换类型时会出现各种强制转换异常。例如,如果我使用 DbType.Binary,并将 someValue 设置为 int32,则在尝试提交时,我得到 System.InvalidCastException:无法将“System.Int32”类型的对象转换为“System.Byte []”类型。
有没有办法做到这一点?
下面为 IUserType 的非工作实现附加代码(基于http://intellect.dk/post/Implementing-custom-types-in-nHibernate.aspx)
public class DataElementType : IUserType
{
SqlType baseType = new SqlType(DbType.Binary);
public SqlType[] SqlTypes
{
get
{
return new[] { baseType };
}
}
public System.Type ReturnedType
{
get { return typeof(object); }
}
public new bool Equals(object x, object y)
{
if (x == null)
return false;
else
return x.Equals(y);
}
public int GetHashCode(object x)
{
return x.GetHashCode();
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
return rs[names[0]];
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
var param = new SQLiteParameter(baseType.DbType, value);
cmd.Parameters.Insert(index, param);
}
public object DeepCopy(object value)
{
if (value == null) return null;
return value;
}
public bool IsMutable
{
get { return false; }
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
}