Подтвердить что ты не робот

Tinyint (байт), SmallInt (Int16), не совместимый с Enum в EF5

Использование первой конструкции базы данных и наличие столбца tinyint (или smallint):

[MyEnumColumn] [tinyint] NOT NULL

Я сопоставил этот столбец с типом Enum в EDM с помощью

External Type: NSpace.MyEnumType
Name:MyEnumType
UnderlyingType:Byte

Где NSpace.MyEnumType определяется следующим образом:

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

Только для получения этой ошибки при попытке загрузить объект из контекста:

Указанная схема недействительна. Ошибки:

Не существует соответствующего типа слоя объекта для концептуального type 'EntityDataModel.MyEnumType'.

Следующая информация может быть полезна при разрешении предыдущей Ошибка:

Основной тип типа перечисления CLR не соответствует базовый тип перечисления EDM.

То же самое относится, если я использую [Smallint] и [Int16], но как только я сменил базу данных на [Int] и тип перечисления на [Int32], ошибка исчезла.

Зачем мне хранить значение enum в поле данных 4Byte (Int) вместо 1Byte (Tinyint), когда перечисления в 99.9% времени не содержат более 256 элементов или я что-то пропустил?

4b9b3361

Ответ 1

Хорошо, если кому-то интересно, проблема заключается в типе по умолчанию enum:

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 }