zoukankan      html  css  js  c++  java
  • 看我72变:解决Entity Framework中枚举类型与tinyint的映射问题

    《看我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类型。

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

  • 相关阅读:
    你知道线程池是如何退出程序的吗?
    华为云GuassDB(for Redis)发布全新版本推出:Lua脚本和SSL连接加密
    分布式消息流平台:不要只想着Kafka,还有Pulsar
    新来的前端小姐姐问:Vue路由history模式刷新页面出现404问题
    1ms的时延,10Gbps速率…5G通信技术解读
    一分钟带你了解Huawei LiteOS组件开发指南
    资深Linux 系统管理员常用的15个很好用的Cron工作示例
    C语言中动态内存分配的本质是什么?
    Python连载8datetime包函数介绍 心悦君兮君不知
    Python连载7time包的其他函数 心悦君兮君不知
  • 原文地址:https://www.cnblogs.com/dudu/p/tinyint_to_byte_to_enum.html
Copyright © 2011-2022 走看看