新增数据模型,新增“实体”之后,新增“枚举类型”,创建Enum值,将“实体”中的列和Enum关联,选中“实体”中的列属性改变类型为Enum名称,生成数据库……

如下转自:http://item.congci.com/item/entity-framework-meiju-leixing-enum

第一步:先创建一个实体对象,在VS 2012里面实体对象还可以修改实体颜色

第二步:对象已经有了,接着创建一个Type,Type为Enum,内部与外部(Internal and External),在空白处右键(学计算机编程时,老师就给我们说,遇到不会就先右键,之后再Google

打开模型浏览器,同样可以添加Enum

第三步:创建Enum值

第四步:让Type引用Enum,选中Type ,查看属性

第五步:生成数据库并添加数据

第六步:运行看一下结果,先猜一下输出的类型 是 ?

很明显,输出的不是1,而是External,这正是我们在绑定时要的值,想不想再看一下数据库里面存储的是什么值呢?

第七步:查看数据库

Type的值是 1 ,不是External,这样是不是提高了我们的开发效率。


解决Entity Framework中枚举类型与tinyint的映射问题

在代码世界中,有一种常见的“变” —— 类型转变。这篇文章分享的就是如何通过类型转变,解决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类型。

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

Entity Framework 的枚举类型的更多相关文章

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

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

  2. Entity Framework Core 软删除与查询过滤器

    本文翻译自<Entity Framework Core: Soft Delete using Query Filters>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意 ...

  3. 【EF】Entity Framework Core 软删除与查询过滤器

    本文翻译自<Entity Framework Core: Soft Delete using Query Filters>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意 ...

  4. 【配置属性】—Entity Framework 对应表字段的类型的设定配置方法

    摘自:http://www.cnblogs.com/nianming/archive/2012/11/07/2757997.html Entity Framework Code First的默认行为是 ...

  5. Entity Framework 教程——Entity Framework中的实体类型

    Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (25) ------ 第五章 加载实体和导航属性之加载完整的对象图和派生类型上的导航属性

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-5  加载完整的对象图 问题 你有一个包含许多关联实体的模型,你想在一次查询中, ...

  7. Entity Framework Code First (四)Fluent API - 配置属性/类型

    上篇博文说过当我们定义的类不能遵循约定(Conventions)的时候,Code First 提供了两种方式来配置你的类:DataAnnotations 和 Fluent API, 本文将关注 Flu ...

  8. Entity Framework 学习中级篇1—EF支持复杂类型的实现

    本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...

  9. 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为

    在日常使用Entity Framework中,数据更新通常会用到.下面就简单封装了一个DBContext类 public partial class EFContext<T> : DbCo ...

随机推荐

  1. python 列表 字典 读写文件:pickle模块的基本使用

    python数据持久存储:pickle模块的基本使用(转载) 作者: pzxbc 出处: http://pzxbc.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保 ...

  2. codeforces567E. President and Roads

    题目大意:总统要回家,会经过一些街道,每条街道都是单向的并且拥有权值.现在,为了让总统更好的回家,要对每一条街道进行操作:1)如果该街道一定在最短路上,则输出“YES”.2)如果该街道修理过后,该边所 ...

  3. Linux_hadoop_install

    1. Build Linux env my env is VM RedHat Linux 6.5 64bit    set fixed IP                  vim /etc/sys ...

  4. SCALA中的函数式编程

    演示了值函数,匿名函数,闭包... 其它具体的应用,还得在生产当中吧.. 这个告一段落..其它SAM,CURRY,高阶函数,集合,泛型,隐式类..这些,还是找专门的书去深入了解啦... C:\User ...

  5. BZOJ [JSOI2008]魔兽地图DotR

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1243  Solved: 532[Submit][S ...

  6. CSS3学习笔记(新属性)

    1. 边框(圆角边框.加阴影和用图片绘制) 新增加 border-radius  box-shadow  border-image .div1{ border:2px solid purple; bo ...

  7. Session之考勤

    昨天初步的调侃了一下cookie,希望看官能够有更轻松愉快的学习和进一步的思考应用. 小编今天突然听到人事怨声载道,原来已多日未进行打卡考勤,虽是弹性工作,也颇有不好意思,决定明日改过,进门刷卡.灵机 ...

  8. c宏的MAX函数

    今天从香山上面回来累的跟傻逼一样,回来问了一下胡总的阿里面试的问题.然后其中有一个是宏写max函数.胡总说不好写,然后我就去洗澡了. 洗澡的时候感觉不对啊,回来写了一个: #define MAX(a, ...

  9. MySQL慢查询(二) - pt-query-digest详解慢查询日志

    一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...

  10. [Android Webkit]JNI基础及Java层与C++层的交互

    1. JNI 注册 1.1. JNI的基础结构       JAVA == JNI == Native Code      JNI(Java Native Interface)是Java与Native ...