Я хочу создать столбец типа enum с именем type, но когда я реконструирую свою базу данных, сгенерированную Code First, он назначает его как int.
Вот мой класс 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; }
}
Любые идеи о том, чего мне здесь не хватает, чтобы получить тип перечисления в моей БД?
@HenkHolterman INT(11) намекает на MySQL, и в этом случае он будет выглядеть как это.
@HenkHolterman Я хочу вернуть значения строкового литерала вместо значений индекса в моей БД. Но я не знаю, как это сделать в Code First.
Существует отправная точка для EF Core в этом открытом выпуске на GitHub, которая позволяет создавать столбцы как тип ENUM, но поскольку они возвращаются клиенту в виде строк, ему требуется дополнительная конфигурация EF Core для преобразования между константами перечисления и строками во время выполнения. Я не думаю, что EF (не-Core) предоставляет достаточно точек расширения, чтобы можно было портировать это решение, и у меня сложилось впечатление, что это вообще невозможно.





Согласно следующему ответу, похоже, что 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
А как бы
enumвыглядел в SQL?