Code First создает int вместо enum

Я хочу создать столбец типа enum с именем type, но когда я реконструирую свою базу данных, сгенерированную Code First, он назначает его как int.

Code First создает int вместо enum

Вот мой класс Enum:

[Flags]
public enum TypeNames
{
    Een = 0,
    Twee = 1,
    Drie = 2
}

Вот мой класс Grounds для создания таблицы с перечислением TypeNames. Класс Properties - это еще одна таблица (Grounds - Properties имеет наследование TPT).

[Table("gronden")]
public partial class Grounds : Properties
{
    [Column("opp")]
    public double? Surface { get; set; }
    [EnumDataType(typeof(TypeNames)), Column("type")]
    public TypeNames Types { get; set; }
}

Любые идеи о том, чего мне здесь не хватает, чтобы получить тип перечисления в моей БД?

А как бы enum выглядел в SQL?

Henk Holterman 14.04.2018 23:32

@HenkHolterman INT(11) намекает на MySQL, и в этом случае он будет выглядеть как это.

user743382 14.04.2018 23:38

@HenkHolterman Я хочу вернуть значения строкового литерала вместо значений индекса в моей БД. Но я не знаю, как это сделать в Code First.

Lorenzo 14.04.2018 23:48

Существует отправная точка для EF Core в этом открытом выпуске на GitHub, которая позволяет создавать столбцы как тип ENUM, но поскольку они возвращаются клиенту в виде строк, ему требуется дополнительная конфигурация EF Core для преобразования между константами перечисления и строками во время выполнения. Я не думаю, что EF (не-Core) предоставляет достаточно точек расширения, чтобы можно было портировать это решение, и у меня сложилось впечатление, что это вообще невозможно.

user743382 14.04.2018 23:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
1 121
1

Ответы 1

Согласно следующему ответу, похоже, что EnumDataTypeAttribute реализован только для компонентов пользовательского интерфейса ASP.NET, а не для использования EF. Должен ли EnumDataTypeAttribute правильно работать в .NET 4.0 с использованием Entity Framework?

В EF Core 2.1 реализована новая функция, позволяющая хранить перечисления в базе данных в виде строк. Это позволяет данным иметь самоописание, что может быть действительно полезно для долгосрочной поддержки. В вашем конкретном случае вы можете просто сделать:

[Table("gronden")]
public partial class Grounds : Properties
{
    [Column("opp")]
    public double? Surface { get; set; }
    [Column("type", TypeName = "nvarchar(24)")]
    public TypeNames Types { get; set; }
}

Вы можете найти более подробную информацию на этой странице: https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions

Кроме того, я заметил, что в вашем перечислении установлен атрибут FlagsAttribute. Вы надеетесь применить несколько значений перечисления к одному объекту? Это должно работать нормально, когда значения сохраняются как int, но не будет работать, если они сохранены как MySQL ENUM или строковый тип данных. MySQL действительно поддерживает тип данных SET, но кажется маловероятным, что EF добавит поддержку этой функции, поскольку в большинстве других баз данных нет аналогичной концепции. https://dev.mysql.com/doc/refman/5.6/en/constraint-enum.html

Если вы действительно хотите разрешить применение нескольких значений перечисления к каждой сущности (аналогично тому, как теги используются в Stack Overflow), вы можете вместо этого подумать о создании отношения «многие ко многим». По сути, это означало бы преобразование перечисления TypeNames в таблицу типов в базе данных и разрешение EF сгенерировать таблицу GroundTypes, чтобы связать их вместе. Вот учебник: http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

Другие вопросы по теме