新增数据模型,新增“实体”以后,新增“枚举类型”,建立Enum值,将“实体”中的列和Enum关联,选中“实体”中的列属性改变类型为Enum名称,生成数据库……数据库
以下转自:http://item.congci.com/item/entity-framework-meiju-leixing-enum编程
第一步:先建立一个实体对象,在VS 2012里面实体对象还能够修改实体颜色数组
第二步:对象已经有了,接着建立一个Type,Type为Enum,内部与外部(Internal and External),在空白处右键(学计算机编程时,老师就给咱们说,遇到不会就先右键,以后再Google)浏览器
打开模型浏览器,一样能够添加Enum安全
第三步:建立Enum值post
第四步:让Type引用Enum,选中Type ,查看属性spa
第五步:生成数据库并添加数据3d
第六步:运行看一下结果,先猜一下输出的类型 是 ?code
很明显,输出的不是1,而是External,这正是咱们在绑定时要的值,想不想再看一下数据库里面存储的是什么值呢?对象
第七步:查看数据库
Type的值是 1 ,不是External,这样是否是提升了咱们的开发效率。
在代码世界中,有一种常见的“变” —— 类型转变。这篇文章分享的就是如何经过类型转变,解决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类型。
注:该解决方法已经过临床验证,确实有疗效,请放心使用!