Howdy, unfortunately I was not able to get an answer from
forum.hibernate.org so I'm reposting this question here.
I am basically wondering how to use sqlite's manifest typing
capabilities with nhibernate?
Put simply, suppose I have a class:
Code:
class A
{
public virtual object SomeValue { get; set; }
}
the type of SomeValue is basically in the set of .NET IConvertible
types (primitives like bool, byte, char, int16, double, float etc.),
plus byte[].
I am trying to create a nhibernate mapping for A to reflect this - so
that I can basically set SomeValue to an arbitrary value and retrieve
it later on as that value. It does not atter if the type is not
exactly preserved as long as the value is preserved (ie I could set
SomeValue = someUInt16Value, and when persisted and retrieved later it
is ok to obtain a SomeValue of another type, provided it can be cast
back to the original).
So far I have tried Creating an implementation of IUserType to try and
handle this. However I don't know what to return for the SqlType[]
SqlTypes. I considered new SqlType(DbType.Object) but when I try to
generate a schema from this I get a System.ArgumentException: Dialect
does not support DbType.Object
If I try another data type then I get various cast exceptions when
trying to convert the type. For instance if i use a DbType.Binary, and
set someValue to an int32, upon attempting to commit I get
System.InvalidCastException: Unable to cast object of type
'System.Int32' to type 'System.Byte[]'.
How can I achieve this?
Attached code below for implementation of IUserType (based on
http://intellect.dk/post/Implementing-custom-types-in-nHibernate.aspx
)
Code:
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;
}
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---