欢迎来到天天文库
浏览记录
ID:62053066
大小:110.63 KB
页数:9页
时间:2021-04-16
《实体类的枚举属性--原来支持枚举类型这么简单没有EF5.0也可以.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以 通常,我们都是在业务层和界面层使用枚举类型,这能够为我们编程带来便利,但在数据访问层,不使用枚举类型,因为很多数据库都不支持,比如我们现在用的SqlServer2008就不支持枚举类型的列,用的时候也是将枚举类型转换成int类型,数据库存储的是int类型的数据,在访问数据的时候进行枚举类型和int类型的转换,例如下面的例子:publicenumRoleNames{User,Manager,Admin}假设有一个实体类Users,如果实体类不支持枚举类型,得这样使用(下面的示例都以PDF.NET的ORM框架使用来说明)://获
2、取一个实体类:Usersuser=newUsers();user.ID=1;if(EntityQuery.Fill(user)){RoleNamesrn=(RoleNames)user.RoleID;Console.Write("RoleName:"+rn);}//更新实体类:Usersuser=newUsers();user.ID=1;user.RoleID=(int)RoleNames.Admin;EntityQuery.Instance.Update(user); 查询和更新操作都得对枚举类型进行转换,不方便,虽然如此,我们大部分情况下还是将就了,在访问
3、数据库的时候这么转换下。这种情况下EF5.0之前也不例外,都是社区用户的强烈要求,在EF5.0版本之后才加入支持实体类枚举属性的。 既然使用枚举还要将实体类的属性转换下,为何不直接将实体类的属性定义成枚举类型? 修改下Users类型的定义:publicpartialclassUsers:EntityBase{//其它部分定义略publicRoleNamesRoleID{get{returngetProperty("RoleID");}set{setProperty("RoleID",value);}}}直接使用这个修改过的实体类来插入、修改数据,是没有问题的:/
4、/更新实体类:Usersuser=newUsers();user.ID=1;user.RoleID=RoleNames.Admin;EntityQuery.Instance.Update(user);但是查询实体类的时候会有点小问题,虽然能够正确的从数据库查询,但查看枚举属性的时候会报类型转换错误://获取一个实体类:Usersuser=newUsers();user.ID=1;if(EntityQuery.Fill(user)){RoleNamesrn=user.RoleID;Console.Write("RoleName:"+rn);} 跟踪代码发现,us
5、er.RoleID对应的SqlReader的结果类型是int,因为数据库的RoleID列没法定义成枚举类型,如果要将实体类的属性定义成枚举类型,那么在SqlReader读取的时候,必须进行类型转换:user.RoleID=(RoleNames)reader["RoleID"]; 幸好PDF.NET的实体类认为“实体类是数据的容器”,内部采用一个object[]保存来自数据库的原始数据,而在使用数据的时候,才来进行类型转换,因此框架原来查询数据、插入、更新数据的地方,都不用做任何修改,只需要修改下getProperty("fieldName")涉及的部分:publicstaticTC
6、hangeType(objectValue){if(ValueisT)return(T)Value;elseif(Value==DBNull.Value
7、
8、Value==null){if(typeof(T)==typeof(DateTime)){//如果取日期类型的默认值0001/01/01,在WCFJSON序列化的时候,会失败。objecto=newDateTime(1900,1,1);return(T)o;}elsereturndefault(T);}else{//editat2011.5.16//如果Value为decimal类型,T 为double类型,(T)Value将发生错
9、误//editat2013.8.9支持枚举类型if(typeof(T).IsEnum)return(T)Value;elsereturn(T)Convert.ChangeType(Value,typeof(T));}}使用PDF.NET框架的V4.X版本(包括V4.6之前的版本)用户,只需要打开CommonUtil.cs文件,找到该方法,将return(T)Convert.ChangeType(Value,t
此文档下载收益归作者所有