Oracle实体类的枚举属性–原来帮忙枚举类型这么简单,没有EF5.0也得以

 if (typeof(T).IsEnum)
       return (T)Value;
 else
       return (T)Convert.ChangeType(Value, typeof(T));
public partial class Users : EntityBase
{
        //其它部分定义略

        public RoleNames RoleID
        {
            get { return getProperty<RoleNames>("RoleID"); }
            set { setProperty("RoleID", value); }
        }

}

   
查询和更新操作都得对枚举类型举行转移,不便宜,就算那样,大家超越二分之一状态下依旧将就了,在造访数据库的时候这么转换下。这种情形下EF
5.0
从前也不例外,都以社区用户的强烈供给,在EF5.0本子之后才进入支持实体类枚举属性的。

            Users user = new Users() { NickName = "pdf.net", RoleID= RoleNames.Admin };

            OQL q0 = OQL.From(user)
               .Select()
               .Where(user.NickName, user.RoleID) 
               .OrderBy(user.ID)
               .END;
            q0.SelectStar = true;
            Console.WriteLine("q0:one table and select all fields \r\n{0}", q0);
            Console.WriteLine(q0.PrintParameterInfo());

            var userList= EntityQuery<Users>.QueryList(q0);
            if (userList.Count > 0)
            {
                Users u = userList[0];
                Console.WriteLine("User Type is:"+u.RoleID.ToString());
                u.RoleID = RoleNames.User;
                EntityQuery<Users>.Instance.Update(u);
            }

O本田CR-VM查询语言(OQL)简介–高级篇(续):五指山真貌

有关链接:

   
幸亏PDF.NET的实体类认为“实体类是数码的器皿”,内部选用二个object[]
保存来自数据库的原始数据,而在运用数据的时候,才来拓展类型转换,由此框架原来查询数据、插入、更新数据的地点,都无须做其余改动,只须要修改下
getProperty<T>(“田野Name”) 涉及的有个别:

 

    跟踪代码发现,user.RoleID 对应的Sql里德r 的结果类型是int
,因为数据库的RoleID
列没办法定义成枚举类型,假诺要将实体类的性质定义成枚举类型,那么在SqlReader读取的时候,必须开展类型转换:

user.RoleID=(RoleNames)reader["RoleID"];
return (T)Convert.ChangeType(Value, typeof(T));

    经过测试,通过如此的修改,框架就能够帮忙实体类使用枚举类型了。

   
既然使用枚举还要将实体类的性质转换下,为啥不直接将实体类的习性定义成枚举类型?
    修改下Users类型的概念:

//获取一个实体类:
Users user=new Users();
user.ID=1;

if(EntityQuery<Users>.Fill(user))
{
 RoleNames rn=user.RoleID;
 Console.Write("Role Name:"+rn);
}
//获取一个实体类:
Users user=new Users();
user.ID=1;

if(EntityQuery<Users>.Fill(user))
{
 RoleNames rn=(RoleNames)user.RoleID;
 Console.Write("Role Name:"+rn);
}


//更新实体类:
Users user=new Users();
user.ID=1;
user.RoleID=(int)RoleNames.Admin;
EntityQuery<Users>.Instance.Update(user);

PDF.NET
开发框架
是国产的支出框架,协理SQL-MAP、OQX56M和数目控件
二种编制程序模型,能够一种或然二种混合使用,是开源的开发框架,供广大.net开发朋友在EF,NH之外,提供第第11中学挑选。欢迎参预PDF.NET开源技术公司

 

 

    数据库结果界面:

Oracle 1

用户实体类定义

   
为何修改如此归纳?前面早已说过,PDF.NET的实体类是数码的器皿,也正是说,我们在内部存款和储蓄器团长有些属性的值直接设置为枚举类型的值,也能够将内部存款和储蓄器中的Int
类型的来自数据库的值,在运转时转换到枚举类型。这样,使得PDF.NET的实体类的习性类型能够无需跟数据库的字段类型严苛对应,只重要项目目相容即可。那些特点为系统移植数据库平台提供了十分的大的便利,比如Oracle
没有Decimal类型,没有real
类型,要使用非整形的数字类型,只有利用Number类型,那么为SqlServer设计使用的实体类,一般景观下也足以直接在Oracle下使用。

       public static T ChangeType<T>(object Value)
       {
           if (Value is T)
               return (T)Value;
           else if (Value == DBNull.Value || Value == null)
           {
               if (typeof(T) == typeof(DateTime))
               {
                   //如果取日期类型的默认值 0001/01/01 ,在WCF JSON序列化的时候,会失败。
                   object o = new DateTime(1900, 1, 1);
                   return (T)o;
               }
               else
                   return default(T);
           }
           else
           {
               //edit at 2011.5.16
               //如果 Value为 decimal类型,T 为double 类型, (T)Value 将发生错误
               //edit at 2013.8.9 支持枚举类型
               if (typeof(T).IsEnum)
                   return (T)Value;
               else
                   return (T)Convert.ChangeType(Value, typeof(T));
           }
       }

直白选用这一个修改过的实体类来插入、修改数据,是从未有过难点的:

Oracle 2Oracle 3

 

    public enum RoleNames
    { 
        User,
        Manager,
        Admin
    }

    测试程序:

//更新实体类:
Users user=new Users();
user.ID=1;
user.RoleID=RoleNames.Admin;
EntityQuery<Users>.Instance.Update(user);

    上面包车型大巴代码是多个完好无损的应用实体类的枚举属性的事例:

即可。

Oracle 4

 

只要有3个实体类Users,假如实体类不支持枚举类型,得这么使用(上面包车型大巴言传身教都以PDF.NET的O纳瓦拉M框架使用来证实):

using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using PWMIS.DataMap.Entity;
using PWMIS.Common;

namespace OQLTest
{
    public enum RoleNames
    { 
        User,
        Manager,
        Admin
    }
    public partial class Users : EntityBase
    {
        public Users()
        {
            TableName = "LT_Users";
            EntityMap = EntityMapType.Table;
            //IdentityName = "标识字段名";
            IdentityName = "ID";

            //PrimaryKeys.Add("主键字段名");
            PrimaryKeys.Add("ID");


        }


        protected override void SetFieldNames()
        {
            PropertyNames = new string[] { "ID", "UserName", "Password", "NickName", "RoleID", "Authority", "IsEnable", "LastLoginTime", "LastLoginIP", "Remarks", "AddTime" };
        }



        /// <summary>
        /// 
        /// </summary>
        public System.Int32 ID
        {
            get { return getProperty<System.Int32>("ID"); }
            set { setProperty("ID", value); }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.String UserName
        {
            get { return getProperty<System.String>("UserName"); }
            set { setProperty("UserName", value, 50); }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.String Password
        {
            get { return getProperty<System.String>("Password"); }
            set { setProperty("Password", value, 50); }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.String NickName
        {
            get { return getProperty<System.String>("NickName"); }
            set { setProperty("NickName", value, 50); }
        }

        /// <summary>
        /// 
        /// </summary>
        public RoleNames RoleID
        {
            get { return getProperty<RoleNames>("RoleID"); }
            set { setProperty("RoleID", value); }
        }

        //用下面的方式处理实体类的子实体类问题
        UserRoles _roles;
        public UserRoles Roles
        {
            get
            {
                if (_roles == null)
                {
                    _roles = new UserRoles() { ID = this.RoleID };
                    EntityQuery<UserRoles>.Fill(_roles);
                }
                return _roles;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.String Authority
        {
            get { return getProperty<System.String>("Authority"); }
            set { setProperty("Authority", value, 250); }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.Boolean IsEnable
        {
            get { return getProperty<System.Boolean>("IsEnable"); }
            set { setProperty("IsEnable", value); }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.DateTime LastLoginTime
        {
            get { return getProperty<System.DateTime>("LastLoginTime"); }
            set { setProperty("LastLoginTime", value); }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.String LastLoginIP
        {
            get { return getProperty<System.String>("LastLoginIP"); }
            set { setProperty("LastLoginIP", value, 20); }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.String Remarks
        {
            get { return getProperty<System.String>("Remarks"); }
            set { setProperty("Remarks", value, 150); }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.DateTime AddTime
        {
            get { return getProperty<System.DateTime>("AddTime"); }
            set { setProperty("AddTime", value); }
        }

    }

}

选拔PDF.NET框架的V4.X 版本(包蕴V4.6事先的版本)用户,只须求开辟
CommonUtil.cs 文件,找到该措施,将

    程序输出:

   
常常,大家都是在业务层和界面层使用枚举类型,那能够为大家编制程序带来方便,但在数额访问层,不应用枚举类型,因为不少数据库都不帮衬,比如大家现在用的SqlServer二〇一〇就不协助枚举类型的列,用的时候也是将枚举类型转换到int
类型,数据仓库储存款和储蓄的是int
类型的数额,在拜访数据的时候实行枚举类型和int类型的更换,例如上面包车型地铁事例:

————–分界线———————-

修改为:

可是查询实体类的时候会有点不是难题,即便可以正确的从数据库查询,但查阅枚举属性的时候会报类型转换错误:

相关文章