2014-06-22 13 views
23

Sto generando una tabella di database utilizzando un campo enum richiesto. Tuttavia, quando si alimenta la tabella, è possibile omettere di alimentare il campo enum: EF non getterà alcun messaggio di errore ma invierà il campo con il valore 0. Puoi aiutarmi a capire cosa sta succedendo? GrazieCodice Entity Framework 6 Primo: il tipo di dati Enum richiesto non funziona

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

risposta

15

Questo è a causa di come i tipi Enum sono gestiti in .NET. Se non si fornisce un valore, è effettivamente lo stesso come se fosse stato assegnato il valore 0. Se il tuo enum ha il valore 0 definito, il valore corretto viene assegnato alla variabile enum. Se il valore non è assegnato, assegna ancora il valore 0 ma fallisce quando si tenta di utilizzarlo perché non può convertire l'int al valore enum corretto.

Nel tuo caso suggerisco se è possibile aggiungere un valore 0 e assegnarlo a un valore specifico o assegnare un valore di Default, Null o qualcosa di simile al tuo enum, ad es.

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

Se si desidera convalidare allora è possibile confrontare tale valore non è uguale a 0.

34

Uso 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; } 
} 
+0

So che questo è stato tre anni fa e tutto, ma questo il metodo duplica le informazioni che probabilmente causerebbero errori lungo la linea. Ad esempio, se aggiungo test5 a 'TestEnum', dovrei ricordare di cambiare l'intervallo su qualsiasi oggetto EF che abbia una proprietà' TestEnum'. – Joe

+0

@Joe: imposta l'attributo di convalida in questo modo [Range (1, int.MaxValue), Display (Name = "Test Enum")], e non avrai problemi con i futuri valori enumerati a meno che non sia int il valore viene inserito manualmente, se proprio è necessario è possibile aggiungere una validazione personalizzata per difendersi da questi casi, ad esempio lasciando che TestEnumClass implementi IValidateObject. Il valore 0 è un valore predefinito quando non viene fornito alcun valore, gli interi positivi maggiori di zero devono essere inseriti manualmente. –

Problemi correlati