NHibernate中IUserType的使用

在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"   />

 

转载于:https://www.cnblogs.com/lichunliang/archive/2011/06/21/2057991.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值