Code First创建int而不是enum

时间:2018-04-14 21:27:53

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

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

enter image description here

这是我的Enum课程:

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

这是我的Grounds课程,用于创建带有' TypeNames' -enum的表格。 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; }
}

我在这里缺少什么想法,以便在我的数据库中输入枚举类型?

1 个答案:

答案 0 :(得分:0)

根据以下答案,看来EnumDataTypeAttribute只为ASP.NET UI组件实现,而不是为EF使用。 Should the EnumDataTypeAttribute work correctly in .NET 4.0 using Entity Framework?

EF Core 2.1实现了一项新功能,该功能允许将Enums作为字符串存储在数据库中。这允许数据进行自我描述,这对于长期可维护性确实很有帮助。对于您的特定情况,您可以执行以下操作:

[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