25

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

4

2 回答 2

70

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

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

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

public enum MyEnumType : byte
{ One, Two, Three, All }
于 2012-11-10T09:12:50.970 回答
0

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

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

然后在模型类文件中

 [Column(TypeName = "tinyint")]
    public MyEnumType? MyEnum { get; set; }   
于 2019-12-04T05:58:25.717 回答