Tinyint(byte),SmallInt(Int16) 与 EF5 中的 Enum 不兼容

Posted

技术标签:

【中文标题】Tinyint(byte),SmallInt(Int16) 与 EF5 中的 Enum 不兼容【英文标题】:Tinyint(byte),SmallInt(Int16) not compatible with Enum in EF5 【发布时间】:2012-10-30 09:43:16 【问题描述】:

使用数据库优先设计并具有 tinyint(或 smallint)列:

[MyEnumColumn] [tinyint] NOT NULL

我使用

将此列映射到 EDM 中的枚举类型
External Type: NSpace.MyEnumType
Name:MyEnumType
UnderlyingType:Byte

其中 NSpace.MyEnumType 的定义如下:

public enum MyEnumType 
 One, Two, Three, All 

仅在尝试从上下文加载实体时出现此错误:

指定的架构无效。错误:

找不到概念的对应对象层类型 输入“EntityDataModel.MyEnumType”。

以下信息可能有助于解决以前的问题 错误:

CLR 枚举类型的底层类型不匹配 EDM 枚举类型的底层类型。

如果我使用 [Smallint] 和 [Int16],同样适用,但是一旦我将数据库更改为 [Int] 并将枚举类型更改为 [Int32],错误就消失了。

当 99.9% 时间内的枚举不超过 256 项时,为什么我需要将枚举值存储在 4Byte (Int) 数据字段而不是 1Byte (Tinyint) 中,或者我是否缺少其他内容?

【问题讨论】:

【参考方案1】:

如果有人感兴趣,问题出在枚举的默认类型上:

public enum MyEnumType 
 One, Two, Three, All 

由于枚举默认为 int 类型,[Underlying Type:Byte] 与 [External Type] MyEnumType:Int 的类型不匹配因此修复对于我原来的 tinyint 字段,您需要像这样定义枚举:

public enum MyEnumType : byte
 One, Two, Three, All 

【讨论】:

这拯救了我的一天 :) +1 好吧,如果有人感兴趣,是的,你一定要救我!!谢谢兄弟!! 修复了我的问题 +1【参考方案2】:

您需要在模型和枚举器中都指定您使用的是 tinyInt 和 Byte 。

在枚举器定义中 public enum MyEnumType : byte One, Two, Three, All

然后在Model类文件中

 [Column(TypeName = "tinyint")]
    public MyEnumType? MyEnum  get; set;    

【讨论】:

以上是关于Tinyint(byte),SmallInt(Int16) 与 EF5 中的 Enum 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

MySQL INT,TINYINT,SMALLINT,BIGINT用法和应用

mysql bigint ,int , smallint,tinyint 的范围

sql server数据库中 smallint, int ,bigint ,tinyint的区别与长度

单个数字的 Mysql 数据类型 - tinyint(1) 或 smallint(1) 或 int(1)

MySQL数据库中int,bigint,smallint和tinyint区别

MYSQL 字段类型之TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT