zoukankan      html  css  js  c++  java
  • NHibernate中IUserType的使用,解决特殊类型或需特殊处理的字段

    在NHibernate的使用中有可能遇到无法自动映射的类型,这个时候就需要自己定义类型了,NHibernate提供了IUserType来自定义新的类型。

    如果某个字段需要处理,继承IUserType则可解决。(NHibernate可扩展性还是很强了)

    示例:(文本中某字段为加密字段,展示需要解密,存储需要加密)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using NHibernate.UserTypes;
    using NHibernate.SqlTypes;
    namespace Training.Models.Util
    {
        public class MyEnDeType : IUserType
        {
            private Type _type = typeof(string);
            #region IUserType 成员
            public bool Equals(object x, object y)
            {
                return x == y;
            }
            public object Assemble(object cached, object owner)
            {
               return  DeepCopy(cached);
            }
    
            public object DeepCopy(object value)
            {
                return value;
            }
    
            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 new MEncry().SenMDecry(Convert.ToString(name), MEncry.encry_type.type2);
            }
    
            public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)
            {
                NHibernate.NHibernateUtil.String.NullSafeSet(cmd, new MEncry().SenMEncry(Convert.ToString(value), MEncry.encry_type.type2), index);
            }
    
            public object Replace(object original, object target, object owner)
            {
                return original;
            }
    
            public Type ReturnedType
            {
                get { return _type; }
            }
    
            public SqlType[] SqlTypes
            {
                get { return new SqlType[] { new SqlType(System.Data.DbType.String, 1) }; }
            }
    
            #endregion
        }
    }
    继承IUserType

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

    <property column="name" type="Train.Utils.MyEnDeType,Train" name="Name" />

    注:NullSafeGet 中的names[0] 为数据库中此字段的值。

    NullSafeSet value为此字段的值。

    备注:

    <property name="name" formula="de_chines_str(name)" />

    初始想法是想使用  formula 属性对字段进行计算,de_chines_str是数据库的函数(自定义函数),结果对字段进行修改时还需要执行另外一个数据库函数,使用formula不能满足要求,所以使用了IUserType自定义类型。

    (使用formula属性,做update操作时字段不更新,暂时不清楚什么原因,可能是认为这个字段是公示计算结果,不是字段)

    仅供参考,内容中会引用部分博友的文章。(侵删)
  • 相关阅读:
    fetch的优点
    gitignore不起作用
    css动画和js动画区别
    工业家居气象空气环境质量监测仪记录数据甲醛PM2.5二氧化碳大气压温湿度
    摆脱淘宝、京东、拼多多内部引流消费规则,自建网站利用其完成支付
    语音朗读模块TTS文本变量实时转语音朗读科大讯飞XFS5152CE芯片AI
    PCB altium designer AD10 AD20 导出DWG CAD文件 过孔问题
    【Creator3】如何在3D场景中实现炫酷传送门,和简单的小地图功能,RenderTexture技术应用
    B站视频:【Creator3】好玩的编队代码 魔性排列停不下来 附源码及出处
    B站视频:《四图猜词》 Part3 | CocosCreator游戏开发教程
  • 原文地址:https://www.cnblogs.com/zeran/p/10875610.html
Copyright © 2011-2022 走看看