标签:
在代码世界中,有一种常见的“变” —— 类型转变。这篇文章分享的就是如何通过类型转变,解决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类型。
注:该解决方法已通过临床验证,确实有疗效,请放心使用!
标签:
原文地址:http://www.cnblogs.com/xuxin-1989/p/4515633.html