2015-12-15 2 views
5

J'utilise l'approche Entity Framework Code First dans mon application MVC et j'ai des classes d'entités pour chaque table de la base de données. D'autre part, je dois utiliser des valeurs de recherche, par exemple genre, statut pour lequel je ne veux pas créer un modèle ou une table de domaine séparé et pour cela je dois définir des valeurs enum dans une classe de modèle de domaine ou une classe séparée . Bien qu'il existe de nombreux échantillons sur le web, je n'ai pas trouvé un approprié pour EF et MVC. Pourriez-vous s'il vous plaît donner un exemple d'utilisation qui remplit ces conditions? Remarque: J'utilise MVC5 et EF6. Voici ma classe d'entité appelée Visitor et entité échantillon qui peut être définie dans une classe séparée (fichier .cs) ou dans la même classe (fichier .cs):Utilisation des valeurs enum dans le modèle de domaine avec le code EF Première approche

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 Désolé, vous avez raison :) J'ai ajouté mon effort, pourriez-vous aider pls? Merci ... –

+0

Si je ne me trompe pas à partir de EF 5.0 enums sont pris en charge hors de la boîte, ce qui signifie que vous pouvez simplement utiliser votre énumération dans le modèle - 'public ReasonOfVisit ReasonOfVisit {get; ensemble; } ' – Fabjan

+0

Qu'est-ce qui ne fonctionne pas exactement? Vous obtenez des erreurs? Cela devrait fonctionner hors de la boîte, tant que le champ num dans votre base de données est défini comme int ou smallint. –

Répondre

2

Si vous voulez utiliser les énumérations avec votre EF modèles, vous pouvez essayer la solution suivante:

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 
    } 

Bien sûr, il est simplifié autant que possible. Ce que vous faites essentiellement est de mapper votre énumération à un type primitif. EF convertira automatiquement les valeurs et vous pourrez l'utiliser comme vous le souhaitez.

+2

Ce mappage n'est pas nécessaire, EF le fait automatiquement. –

+0

@ L-Three Je ne le savais pas :) – Kamo

+0

@Kamo Merci pour votre réponse. En fait j'utilise EF6 et je pense qu'il n'y a pas besoin d'utiliser la partie UserConfiguration. Quoi qu'il en soit, je me demande comment utiliser les valeurs de chaîne dans des énumérations dans cet exemple, c'est-à-dire "Business meeting"? –

2

Avec Entity Framework 5.0 partir vous pouvez simplement utiliser votre 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; } 

     ... 
    } 
} 

Si vous utilisez EF < 5.0 vous pouvez utiliser la propriété de type ENUM mis en correspondance avec la propriété octet/int

public class Visitor 
{ 
    ... 

    public byte ReasonOfVisitAsByte { get; set; } 

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

    ... 
} 

PS En ce qui concerne vos questions:

Quel sera le type de données des valeurs ENUM

EF utilisera int Type

le plus probable Comment puis-je définir des valeurs de chaîne dans ce ENUM

Vous ne pouvez pas utiliser les chaînes directement mais si vous utilisez des attributs e efforts supplémentaires, il est possible de définir que enum renvoie la chaîne directement et non sa valeur int. Vous pouvez en lire plus à ce sujet here

+0

Merci pour votre réponse. Il semble fonctionner, mais les valeurs enum sont converties en valeurs id après le passage du contrôleur à la vue. Maintenant, j'ai 2 questions: 1) Quel sera le type de données des valeurs enum? Parce que nous ne l'avons pas défini ici, sera-t-il attribué automatiquement? 2) Comment puis-je définir des valeurs de chaîne dans cette énumération, c'est-à-dire "Business meeting"? –

+0

Un grand merci pour votre réponse. J'ai essayé quelques méthodes pour afficher les multiples valeurs de mot de enum ie [Traiter avec Enum dans MVC 5.1] (http://www.codeproject.com/Articles/776908/Dealing-with-Enum-in-MVC) mais ne peut toujours pas afficher leur. Afficher la propriété est ok, mais je ne suis pas sûr de ce que j'ai manqué. Une idée? D'autre part comme cette réponse est très utile pour moi j'ai voté + –