这是张贴在hibernate.org上论坛和nhusers名单没有太多的运气,所以我想我会尝试在这里。
简单地说,假设我有一个类:
class A
{
public virtual object SomeValue { get; set; }
}
someValue中的类型基本上是在集.NET IConvertible类型(基元像布尔,字节,字符,INT16,双,浮动等),加上字节[]和字符串。
我想创建一个NHibernate的映射为一个以反映这一 - 这样我就可以基本设置someValue中以任意对象(上面的类型之一)和检索后来上。 然后我AppLogic的将反映在它找到的类型和相应的行为。
到目前为止,我已经尝试创建IUserType的实现,试图处理这个问题。 但是我不知道是什么,返回该SQLTYPE []的SQLType。 我认为新的SQLTYPE(DbType.Object),但是当我尝试生成这个架构,我得到一个System.ArgumentException:方言不支持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;
}
}