NHibernate中IUserType的使用

时间:2021-08-19 03:09:17

在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
    }
}

重点就在于NullSafeSet和NullSafeGet方法中,在这里要对数据类型进行处理。然后直接在xml中使用就行了。

 

< property  column ="SOURCE_TCTIME"  type ="HHSoft.LandSupply.DataEntity.NHibernateType.MyDateTime,HHSoft.LandSupply.DataEntity"  name ="SourceTctime"   />

 

相关文章