【问题标题】:Code First creates int instead of enumCode First 创建 int 而不是 enum
【发布时间】:2018-04-14 21:27:52
【问题描述】:

我想创建一个名为“type”的枚举类型列,但是当我对 Code First 生成的数据库进行反向工程时,它会将其分配为“int”。

这是我的枚举类:

[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 中会是什么样子?
  • @HenkHolterman INT(11) 暗示 MySQL,在这种情况下它看起来像 like this
  • @HenkHolterman 我想返回字符串文字值而不是我的数据库中的索引值。但我不知道如何在 Code First 中管理它。
  • EF Core at this open issue on GitHub 有一个起点,它允许将列创建为 ENUM 类型,但由于它们作为字符串返回给客户端,因此需要更多 EF Core 配置来转换在运行时枚举常量和字符串之间。我不认为 EF(非核心)提供了足够的扩展点来允许移植该解决方案,我觉得这根本不可能。

标签: entity-framework enums ef-code-first


【解决方案1】:

根据以下答案,似乎 EnumDataTypeAttribute 仅针对 ASP.NET UI 组件实现,而不是针对 EF 使用。 Should the EnumDataTypeAttribute work correctly in .NET 4.0 using 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 枚举转换为数据库中的 Types 表,并允许 EF 生成 GroundTypes 表以将它们链接在一起。这是一个教程: http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多