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)