2015-12-15 27 views
5

Uso l'approccio Entity Framework Code First nell'applicazione MVC e ho alcune classi di entità per ogni tabella nel database. D'altra parte, ho bisogno di utilizzare alcuni valori di ricerca, ad esempio genere, stato per il quale non voglio creare un modello di dominio o una tabella separati e per questo motivo devo definire i valori enum in una classe modello di dominio correlata o una classe separata . Sebbene ci siano molti esempi sul web, non ne ho trovato uno adatto per EF e MVC. Potresti fornire un esempio di utilizzo che soddisfi questi requisiti?Utilizzo dei valori enum nel modello di dominio con codice EF Primo approccio

Nota: utilizzo MVC5 e EF6. Qui è la mia classe di entità chiamata Visitor e l'entità del campione che può essere definito in una classe separata (Cs file) o nella stessa classe (Cs file):

namespace MyProject.Entities 
{ 
    public class Visitor 
    { 
     [Key] 
     public int VisitorID { get; set; } 

     public string VisitorName { get; set; } 

     //[ForeignKey("ReasonOfVisit")] 
     public byte ReasonOfVisit { get; set; } 

     //code omitted for brevity 
    } 


    public enum ReasonOfVisit 
    { 
     NotSet = 0, 
     Business meeting = 1, 
     Periodic visit = 2, 
     Getting information = 3, 
     Leaving package = 4 
    } 
} 
+0

@Fabjan Ci dispiace, hai ragione :) Ho aggiunto il mio impegno, potresti aiutare pls? Grazie ... –

+0

Se non sbaglio partendo da EF 5.0 le enumerazioni sono supportate fuori dalla scatola in modo efficace nel senso che puoi semplicemente usare il tuo enum nel modello - 'public ReasonOfVisit ReasonOfVisit {get; impostato; } ' – Fabjan

+0

Che cosa esattamente non funziona? Hai errori? Questo dovrebbe funzionare immediatamente, purché il campo numerico nel database sia definito come int o smallint. –

risposta

2

Se si desidera utilizzare le enumerazioni con il tuo modelli EF, si può provare seguente soluzione:

public class User 
    { 
     public string Id { get; set; } 

     public RegistrationStatus RegistrationStatus { get; set; } 
    } 

    public class UserConfiguration : EntityTypeConfiguration<User> 
    { 
     public UserConfiguration() 
     { 
       this.Property(x => x.RegistrationStatus) 
       .HasColumnType("int") 
       .IsRequired(); 
     } 
    } 

    public enum RegistrationStatus 
    { 
     Pending = 1, 
     Active = 2, 
     Blocked = 3 
    } 

naturalmente è semplificato il più possibile. Quello che fai in pratica è mappare il tuo enum ad un tipo primitivo. EF convertirà automaticamente i valori e potrai usarlo come vorresti.

+2

Questa mappatura non è necessaria, EF lo fa automaticamente. –

+0

@ L-Three Non ne siamo a conoscenza :) – Kamo

+0

@Kamo Grazie per la risposta. In realtà io uso EF6 e penso che non sia necessario utilizzare la parte UserConfiguration. Ad ogni modo, mi chiedo come utilizzare i valori stringa in enumerazioni in questo esempio, ad esempio "Incontro d'affari"? –

2

Con Entity Framework 5.0 in poi si può semplicemente utilizzare l'enum:

namespace MyProject.Entities 
{ 
    public enum ReasonOfVisit 
    { 
     NotSet = 0, 
     For business reason = 1, 
     For control = 2, 
     For lefting package = 3, 
     For leisure = 4 
    } 

    public class Visitor 
    { 
     ... 

     public ReasonOfVisit ReasonOfVisit { get; set; } 

     ... 
    } 
} 

Se stai usando EF < 5.0 è possibile utilizzare tipo enum immobili mappato alla proprietà byte/int

public class Visitor 
{ 
    ... 

    public byte ReasonOfVisitAsByte { get; set; } 

    public ReasonOfVisit ReasonOfVisit { get { return (ReasonOfVisit)ReasonOfVisitAsByte; } 
             set { ReasonOfVisitAsByte = (byte)value; } } 

    ... 
} 

PS quanto riguarda le vostre domande:

Quale sarà il tipo di dati del enum valori

EF, molto probabilmente l'uso int tipo

Come posso definire i valori di stringa in questo enum

Non è possibile utilizzare direttamente le stringhe, ma se si utilizzano gli attributi e si effettua E ulteriori sforzi è possibile impostare che enum restituisca direttamente la stringa e non il suo valore int. Puoi leggere di più su di esso here

+0

Grazie per la risposta. Sembra che funzioni, ma i valori di enum vengono convertiti nei valori id dopo il passaggio dal controller alla vista. Ora ho 2 domande: 1) Quale sarà il tipo di dati dei valori enumerati? Perché non abbiamo impostato qui, sarà assegnato automaticamente? 2) Come posso definire i valori stringa in questo enum, ad esempio "Incontro d'affari"? –

+0

Mille grazie per la tua risposta. Ho provato alcuni metodi per visualizzare i valori di più parole di enum, ovvero [Gestione di Enum in MVC 5.1] (http://www.codeproject.com/Articles/776908/Dealing-with-Enum-in-MVC) ma non riesco ancora a visualizzare loro. Mostra proprietà è ok, ma non sono sicuro di cosa mi sia mancato. Qualche idea? D'altra parte come questa risposta è molto utile per me ho votato + –