实体框架6代码优先-必需的枚举数据类型不工作

本文关键字:枚举 数据类型 工作 框架 代码 实体 | 更新日期: 2023-09-27 18:09:51

我正在使用所需的enum字段生成一个数据库表。但是,在提供表时,可以省略提供enum字段:EF不会抛出任何错误消息,但会以0值提供该字段。你能帮我理解发生了什么吗?由于

   public enum TestEnum {
        test1=1,
        test2=2,
        test3=3,
        test4=4
    }
public class TestEnumClass
{
    [Key]
    public int id { get; set; }
    [Required(ErrorMessage = "Required"), Display(Name = "Test Enum")]
    public TestEnum test{ get; set; }
}

实体框架6代码优先-必需的枚举数据类型不工作

使用RangeAttribute:

public enum TestEnum
{
    test1 = 1,
    test2 = 2,
    test3 = 3,
    test4 = 4
}
public class TestEnumClass
{
    [Key]
    public int id { get; set; }
    [Range(1, 4), Display(Name = "Test Enum")]
    public TestEnum test{ get; set; }
}

这是因为。net中枚举类型的处理方式。如果您不提供一个值,它实际上与赋值0相同。如果枚举定义的值为0,则将正确的值赋给枚举变量。如果未赋值—它仍然赋值0,但当您尝试使用它时失败,因为它无法将int转换为正确的enum值。

在你的情况下,我建议如果有可能添加一个0的值,并将其分配给一个特定的值或分配默认值,Null或类似于你的枚举值,例如

public enum TestEnum {
    NotSet = 0,
    test1 = 1,
    test2 = 2,
    test3 = 3,
    test4 = 4
}

如果你想验证它,那么你可以比较这个值不等于0

你可以这样做吗?

public class TestEnumClass
{
    [Key]
    public int id { get; set; }
    [Required(ErrorMessage = "Required"), Display(Name = "Test Enum")]
    public TestEnum? test{ get; set; }
}

也就是说,将"test"定义为可空的,然后将其标记为[Required]来强制它有一个值。