Подтвердить что ты не робот

Entity Framework 6 Code First - Обязательный тип данных 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; }
}
4b9b3361

Ответ 1

Это связано с тем, как типы контировки обрабатываются в .NET. Если вы не указали значение, оно фактически будет таким же, как если бы было присвоено значение 0. Если ваше перечисление имеет значение 0, то правильное значение присваивается переменной перечисления. Если значение не назначено - оно по-прежнему назначает значение 0, но оно терпит неудачу при попытке использовать его, потому что оно не может преобразовать int в правильное значение перечисления.

В вашем случае я предлагаю, можно ли добавить значение 0 и присвоить его определенному значению или присвоить значение по умолчанию, нуль или что-то подобное вашему перечислению, например

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

Если вы хотите проверить его, вы можете сравнить это значение не равным 0.

Ответ 2

Используйте 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; }
}

Ответ 3

Можете ли вы сделать это так:

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

То есть, определите "тест" как обнуляемый, но затем отметьте его [Обязательно], чтобы оно имело значение.

Подобное обсуждение относится к целым здесь.