《看我72变》是蔡依林的一首歌,“我要洗心革面,人定可以胜天,梦想近在眼前。。。”

在代码世界中,有一种常见的“变” —— 类型转变。这篇文章分享的就是如何通过类型转变,解决Entity Framework(5.0之前的版本)中枚举类型(实体)与 tinyint(数据库字段类型)的映射问题。

对于需要进行持久化的枚举类型,我们通常在数据库表中建立一个对应的tinyint类型的字段。

如果我们使用Entity Framework作为ORM,将面临两个问题:

1. EF不支持枚举类型的直接映射(5.0之前的版本)

2. 对于tinyint数据库类型,不管对应的实体属性定义的是什么类型,EF始终映射为byte类型。

相应的解决方法也不难:

1. 给实体增加一个“中间人”属性,与数据库中对应的字段进行映射,然后再转换为枚举类型。

2. 将这个“中间人”属性定义为byte类型。

于是就有了下面的代码:

public class BlogCategory
{public CategoryType CategoryType { get; set; }

public byte CategoryTypeByte { get; set; }
}

BlogCategory.CategoryType是枚举类型的属性,是代码中实际访问的属性;BlogCategory.CategoryTypeByte是增加的“中间人”属性,专用于映射数据库中tinyint类型的字段。

随之,难题出现了,如何在枚举类型与bype类型之间进行转换呢?在读取BlogCategory.CategoryType属性时,需要将byte转换为枚举;在写入BlogCategory.CategoryType属性时,需要将枚举转换为byte。

枚举类型可以方便地转换为int类型,但int类型是32位的(4个byte)。也就是说,这两者尺码不一样,大转小,要减肥;小转大,要增胖。

对于类型转换安全问题,我们无需担心,因为数据库中是tinyint类型,数据的长度不会超过1个byte。

那如何转换呢?

.NET提供了一个强大的转换器 —— System.BitConverter,让我们来看看如何通过它实现72变。

1. 大转小,减肥,枚举转byte。

public BlogCategoryType CategoryType
{set{CategoryTypeByte = BitConverter.GetBytes((int)value)[0];}
}

将枚举转换为int,再将int转换为byte数组,然后取第一个元素。

2. 小转大,增胖,byte转枚举。

public BlogCategoryType CategoryType
{get{return (BlogCategoryType)BitConverter.ToInt32(new byte[] { CategoryTypeByte, 0x0, 0x0, 0x0 }, 0);}
}

增加三个值为0的byte,与CategoryTypeByte组合为长度为4的byte数组(因为int类型的需要),然后将这个byte数组转换为int类型。

注:该解决方法已通过临床验证,确实有疗效,请放心使用!

看我72变:解决Entity Framework中枚举类型与tinyint的映射问题相关推荐

  1. 解决Entity Framework中DateTime类型字段异常

    从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值 具体的错误原因是:C#中的DateTime类型比SqlServer中的datetime范围大.SqlServe ...

  2. 在Entity Framework中使用存储过程(一):实现存储过程的自动映射

    之前给自己放了一个比较长的假期,在这期间基本上没怎么来园子逛.很多朋友的留言也没有一一回复,在这里先向大家道个歉.最近一段时间的工作任务是如何将ADO.NET Entity Framework 4.0 ...

  3. 在Entity Framework中使用事务

    继续为想使用Entity Framework的朋友在前面探路,分享的东西虽然技术含量不高,但都是经过实践检验的. 在Entity Framework中使用事务很简单,将操作放在TransactionS ...

  4. 如何处理Entity Framework中的DbUpdateConcurrencyException异常

    如何处理Entity Framework中的DbUpdateConcurrencyException异常 参考文章: (1)如何处理Entity Framework中的DbUpdateConcurre ...

  5. Entity Framework中的Migrations

    Migrations是Entity Framework中非常有意思的一个工具.Migrations 的目的是用来跟踪数据库的改变. 假如我们想回滚到一个月前的代码,非常容易,有版本管理工具.但是要回滚 ...

  6. 关于Entity Framework中的Attached报错相关解决方案的总结

    关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法 ...

  7. java 调用枚举种方法_Java中枚举类型的一种使用方式

    今天改同事的代码发现同事的代码中有大量的if else语句.很不美观而且可读性太差. 因为需要给前端一个key,value的列表.这个列表写死.然而同事的代码. 放几张图,大家自己感受.我都不知道以后 ...

  8. C#中枚举类型enum的使用[转载]

    C#中枚举类型enum的使用 关于enum应用的总结(摘自http://hi.baidu.com/yangzhiping/blog/item/9d841fd5a4309dc451da4baa.html ...

  9. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

最新文章

  1. opencv倾斜矫正
  2. python填写excel-Python读写Excel表格(简单实用)
  3. Float浮点数的使用和条件
  4. GContracts1.1.0支持前置/后置条件的继承
  5. QCustomPlot使用手册(二)
  6. oracle date类型,oracle 日期时间数据类型
  7. Trace SAP OData execution in CRM backend system
  8. java第二周学习总结
  9. 关于Eclipse基本设置(字体大小、项目导入、简单)
  10. JavaScript把客户端时间转换为北京时间
  11. USACO milk
  12. html5 图片热点area,map的用法
  13. 显示器说:偶好惨啊,每天给人看。
  14. 微信公众号新浪百度云做服务器
  15. Maya中AO贴图的一些烘焙心得
  16. 车牌字符识别LPRNet:License Plate Recognition via Deep Neural Networks
  17. 计算机专业的电脑桌面,win7电脑桌面计算机图标不见了怎么办
  18. Unity 3D做2D坦克大战,控制图片切换朝向的2种方法。
  19. 基于51单片机PWM(即脉冲宽度调制)调速数码管显示测速L298M芯片控制直流电机正反运转的项目
  20. 安装Tomcat服务器

热门文章

  1. keras如何在验证集加噪声_Keras从时域、频域处理音频分类问题(带详细注释)...
  2. c语言编程中如何对其,C语言内存对齐详解(3)
  3. c程序设计语言如何补零,C语言程序设计(补)-中国大学mooc-题库零氪
  4. php __call实现多继承,php如何使用_call实现多继承(代码示例)
  5. 第二章 Cameras, Lights, and Shadows
  6. AI学习笔记(十三)CNN之人脸检测
  7. springboot文件上传和下载工具_SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有...
  8. 系统设计(二)——TinyURL系统设计
  9. PSENet PANNet DBNet 三个文本检测算法异同
  10. python语言应用章节答案_智慧树APPPython语言应用第十单元章节测试答案