在NHibernate的使用中有可能遇到无法自动映射的类型,这个时候就需要自己定义类型了,NHibernate提供了IUserType来自定义新的类型。
这里以一个可空的时间类型为例:
using
System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate.UserTypes;
using NHibernate.SqlTypes;
using System.Data.OracleClient;
namespace HHSoft.LandSupply.DataEntity.NHibernateType
{
public class MyDateTime : IUserType
{
private Type _type = typeof (DateTime ? );
#region IUserType 成员
public object Assemble( object cached, object owner)
{
return DeepCopy(cached);
}
public object DeepCopy( object value)
{
return value;
}
public new bool Equals( object x, object y)
{
return x == y;
}
public object Disassemble( object value)
{
return DeepCopy(value);
}
public int GetHashCode( object x)
{
return x.ToString().GetHashCode();
}
public bool IsMutable
{
get { return false ; }
}
public object NullSafeGet(System.Data.IDataReader rs, string [] names, object owner)
{
object name = NHibernate.NHibernateUtil.String.NullSafeGet(rs, names[ 0 ]);
if (name == null )
return null ;
return (DateTime ? )Convert.ToDateTime(name);
}
public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)
{
OracleParameter par = cmd.Parameters[index] as OracleParameter;
if (par != null ){
par.IsNullable = true ;
par.OracleType = OracleType.DateTime;
}
NHibernate.NHibernateUtil.String.NullSafeSet(cmd, value, index);
}
public object Replace( object original, object target, object owner)
{
return original;
}
public Type ReturnedType
{
get { return _type; }
}
public NHibernate.SqlTypes.SqlType[] SqlTypes
{
get { return new SqlType[] { new SqlType(System.Data.DbType.String, 1 ) }; }
}
#endregion
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate.UserTypes;
using NHibernate.SqlTypes;
using System.Data.OracleClient;
namespace HHSoft.LandSupply.DataEntity.NHibernateType
{
public class MyDateTime : IUserType
{
private Type _type = typeof (DateTime ? );
#region IUserType 成员
public object Assemble( object cached, object owner)
{
return DeepCopy(cached);
}
public object DeepCopy( object value)
{
return value;
}
public new bool Equals( object x, object y)
{
return x == y;
}
public object Disassemble( object value)
{
return DeepCopy(value);
}
public int GetHashCode( object x)
{
return x.ToString().GetHashCode();
}
public bool IsMutable
{
get { return false ; }
}
public object NullSafeGet(System.Data.IDataReader rs, string [] names, object owner)
{
object name = NHibernate.NHibernateUtil.String.NullSafeGet(rs, names[ 0 ]);
if (name == null )
return null ;
return (DateTime ? )Convert.ToDateTime(name);
}
public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)
{
OracleParameter par = cmd.Parameters[index] as OracleParameter;
if (par != null ){
par.IsNullable = true ;
par.OracleType = OracleType.DateTime;
}
NHibernate.NHibernateUtil.String.NullSafeSet(cmd, value, index);
}
public object Replace( object original, object target, object owner)
{
return original;
}
public Type ReturnedType
{
get { return _type; }
}
public NHibernate.SqlTypes.SqlType[] SqlTypes
{
get { return new SqlType[] { new SqlType(System.Data.DbType.String, 1 ) }; }
}
#endregion
}
}
重点就在于NullSafeSet和NullSafeGet方法中,在这里要对数据类型进行处理。然后直接在xml中使用就行了。
<
property
column
="SOURCE_TCTIME"
type
="HHSoft.LandSupply.DataEntity.NHibernateType.MyDateTime,HHSoft.LandSupply.DataEntity"
name
="SourceTctime"
/>