《看我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. 令人迷惑的ATT的jmp:直接跳转和间接跳转 [转]
  2. Nginx(OpenResty)+Lua+Redis IP限流 10s内
  3. 【Qt】2D绘图之绘制图片
  4. 网络编程释疑之:TCP协议的“流”特性
  5. 在物欲横流,心浮气躁的今天,毕业生靠什么来维持自己的梦想?
  6. java连接phpstudy_PHPStudy快速自动搞定所有配置文件
  7. Linux多线程——使用互斥量同步线程
  8. 自动驾驶再出事!欧洲一辆自动驾驶小公交撞到行人
  9. python 直线虚线_python – matplotlib中的虚线而不是缺失值
  10. 数论入门 2021-2-28
  11. tableau入门视频笔记(一)
  12. 解决阿里云图片超过20M无法缩放的问题
  13. 学计算机如何防辐射,日常生活如何防辐射 学会这4招不用怕
  14. Java整合极光推送
  15. php是什么电器元件,看完这个保证你认识“贴片电路板上”的每一个电子元件
  16. LightOJ 1197 Help Hanzo
  17. 2021年茶艺师(初级)考试题及茶艺师(初级)最新解析
  18. 拯救脂肪肝第一步!以飞桨3D医疗影像分割方案MedicalSeg自主诊断脂肪肝
  19. [Python3] Matplotlib —— (四) 可视化异常处理
  20. 计算机管理恢复分区,Win10硬盘新增的恢复分区是什么?

热门文章

  1. java邮箱找回密码_java实现邮箱找回密码 简单邮件
  2. 捷克论坛最新ip地址_最新macOS破坏SSH默认规则,程序员无法登录Web服务器
  3. 枪火游侠服务器停机维护,腾讯《枪火游侠》公布国服停运公告 11月30日正式关服...
  4. linux apktool使用教程,简单介绍ubuntu下apktool的使用与配置
  5. mysql 性能问题_mysql 性能问题
  6. android 动态更改包名,Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)...
  7. 凭证反过账 金蝶k3_建议收藏!金蝶快捷键操作大全!
  8. 带背景音乐的表白html,感人的表白背景音乐,适合浪漫表白的纯音乐
  9. SQLite Tutorial 3 : Working with important SqLite Queries (SELECT, INSERT, DELETE, UPDATE,WHERE...)
  10. ResNeXt结构(code)