2016-02-04 5 views
3

Возможно ли использовать перечисление в качестве первичного ключа для таблицы? У меня есть что-то вроде следующего:Использование перечисления в качестве первичного ключа с EF

public enum SpecialId : uint {} 

public class Thing 
{ 
    public SpecialId Id { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Thing> Things { get; set; } 
} 

Но я получаю следующую ошибку при инициализации:

unhanded исключение типа «System.InvalidOperationException» произошло в EntityFramework.dll

Дополнительная информация : Ключевой компонент «Идентификатор» не является объявленным свойством в типе «Вещь». Убедитесь, что он не был явно исключен из модели и что он является допустимым примитивным свойством.

Это сказать, что это должно быть примитивным (перечисление только литьевой к primitave), но EF post around enums sugguests это возможно

Перечисления в качестве ключей

Кроме того, свойства перечисления типы могут участвовать в определении первичных ключей, уникальных ограничений и внешних ключей, а также принимать участие в проверках контроля параллелизма и объявлять значения по умолчанию.

Я делаю что-то неправильно или это просто не поддерживается?

На стороне не знаю, что я мог бы взломать эту функциональность, используя другое свойство, не отображаемое на нем, чтобы перевести ключи в перечисления. Это не ответ я ищу

+0

вы рассмотрели добавив атрибут' Key'? также какая версия EF? –

+0

Да, это не помогает (например, 'HasKey (x => x.Id)'). EF должен все равно подбирать это по соглашению, но я попробовал это, чтобы узнать, была ли проблема. –

+0

Вы делаете код первым ??? –

ответ

4

Это не работает, потому что ваше перечисление основано на uint. EF не поддерживает беззнаковые интегральные типы в целом (т. Е. Вы можете использовать тип uint для свойства), и поэтому он не будет работать и для свойств перечисления.

Я лично не большой поклонник ключей перечисления. Вот лишь несколько причин:

  • значение в базе данных могут выйти из синхронизации очень легко с определением перечислений
  • это может быть нарушено из коробки, если база данных генерируют ключи - как правило, начинается с базой данных генерирование идентификаторов от 1, но первый член перечисления равен 0
  • Типы перечислений обычно имеют только несколько констант/членов. Хотя возможно иметь значения, которые находятся в диапазоне типа перечисления, но не имеют соответствующей константы в типе перечисления (и EF поддерживает это), это приводит к потере цели использования типа перечисления
+0

Ужасно это исправляет проблему. Я получаю то, что вы говорите о перечислениях в качестве ключей, и я полностью согласен. Моим вариантом использования является то, что я хочу перечисление с отношением 1: * с другим объектом в БД. Таблица enum обновляется при запуске приложения с фактического перечисления в коде, и любые несуществующие перечисления удаляются. Я подумал об использовании совершенно отдельного ключа для этого, но я не думаю, что он на самом деле выигрывает у меня, если я вывожу данные непосредственно из перечисления. –

+0

Все нормально. Как со всем - если вы понимаете, как все работает, и каковы ограничения и риски, вы должны быть хорошо подталкивать его. – Pawel

+0

Да, основной директор имеет один канонический источник данных. В этом случае код является каноническим источником, но я хочу ссылаться на него в базе данных определенным образом. Когда вы пытаетесь смешивать канонические источники, создавая вещи, которые могут быть созданы в любом коде или приложении, у вас возникают проблемы. –

3

Похоже, проблема связана с базовым типом enum.

я не сделал»найти какую-либо информацию, но быстрый тест показывает, что поддерживаются следующие типы

byte, short, int, long 

и следующие не

sbyte, ushort, uint, ulong 
Смежные вопросы