web-dev-qa-db-fra.com

Entity Framework 6 Code First - Le type de données Enum requis ne fonctionne pas

Je génère une table de base de données en utilisant un champ d'énumération obligatoire. Cependant, lors de l'alimentation de la table, il est possible d'omettre d'alimenter le champ enum: EF ne lancera aucun message d'erreur mais alimentera le champ avec la valeur 0. Pouvez-vous m'aider à comprendre ce qui se passe? Merci

   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; }
}
24
tit

Cela est dû à la façon dont les types Enum sont traités dans .NET. Si vous ne fournissez pas de valeur, c'est en fait la même chose que si la valeur 0 a été affectée. Si votre énumération a la valeur 0 définie, la valeur correcte est affectée à la variable énumération. Si la valeur n'est pas affectée - elle affecte toujours la valeur 0 mais elle échoue lorsque vous essayez de l'utiliser car elle ne peut pas convertir l'int en la valeur d'énumération correcte.

Dans votre cas, je suggère s'il est possible d'ajouter une valeur de 0 et de l'attribuer à une valeur spécifique ou d'affecter une valeur par défaut, nulle ou quelque chose de similaire à votre énumération, par ex.

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

Si vous souhaitez le valider, vous pouvez comparer cette valeur n'est pas égale à 0.

17
dotnetom

Utilisez 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; }
}
34
Petr Hruzek

Pouvez-vous le faire de cette façon:

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

Autrement dit, définissez "test" pour être annulable, mais marquez-le ensuite [Obligatoire] pour le forcer à avoir une valeur.

Discussion similaire liée aux ints ici.

0
DRLaFosse