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

时间:2012-11-10 02:55:36

标签: entity-framework-5 sqldatatypes

使用数据库优先设计并使用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)中?

2 个答案:

答案 0 :(得分:65)

如果有人有兴趣,问题是枚举的默认类型:

public enum MyEnumType 
{ One, Two, Three, All }

由于枚举默认为 int ,因此[基础类型:{字节}]与[外部类型] {MyEnumType:Int}的类型不匹配,因此需要修复对于我原来的tinyint字段,你需要像这样定义你的枚举:

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

答案 1 :(得分:0)

您需要在Model和Enumerator中同时指定您使用tinyInt和Byte。

枚举器定义中的

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

然后在Model类文件中

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