Entity Framework 6 Code First - 必需的枚举数据类型未起作用

24

我正在使用一个必需的枚举字段生成数据库表。然而,在填充表格时,有可能遗漏填写枚举字段: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; }
}
3个回答

35

使用 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; }
}

我知道这是三年前的事了,但这种方法会复制信息,可能会导致以后出现错误。例如,如果我将test5添加到TestEnum,我必须记得更改具有TestEnum属性的任何EF对象上的范围。 - Joe
@Joe: 设置验证属性如下 [Range(1, int.MaxValue), Display(Name = "测试枚举")], 这样除非手动输入不正确的 int 值,否则您将不会遇到未来添加枚举值的任何问题。如果确实需要,您可以添加自定义验证以防御这些情况,例如让 TestEnumClass 实现 IValidateObject 接口。当没有给出值时,0 值是默认值,大于零的正整数必须手动输入。 - Kaveh Hadjari

18
这是因为在.NET中处理枚举类型的方式。如果没有提供值,则等效于分配值0。如果您的枚举定义了值0,则正确的值将分配给枚举变量。如果未分配值,它仍然分配值0,但尝试使用时会失败,因为它无法将int转换为正确的枚举值。
建议您在可能的情况下为0添加一个特定值并将其分配给枚举值或分配Default、Null或类似的值,例如:
public enum TestEnum {
    NotSet = 0,
    test1 = 1,
    test2 = 2,
    test3 = 3,
    test4 = 4
}
如果您想要验证它,那么您可以比较该值是否不等于0。

2
你能这样做吗:

这样做可以吗:

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

也就是说,将 "test" 定义为可为空,但随后标记为 [Required] 以强制其具有值。
在这里可以找到与整数相关的类似讨论:这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接