53 votes

Comment travailler avec les Énumérations dans le Cadre de l'Entité?

Quelle est la meilleure façon de travailler avec les Énumérations dans le Cadre de l'Entité?

Remarques: je suis en utilisant EF 3 et Firebird.

27voto

Craig Stuntz Points 95965

Il est un peu meilleur moyen de le faire en EF 4. Malheureusement, il ne fonctionne pas en EF 1.

Voici une autre approche.

Mise à jour: Véritable prise en charge des énumérations a été ajouté dans le juin 2011 EF CTP.

20voto

Geoff Points 2586

Mise à jour:
Entity Framework prend désormais en charge les Énumérations de la nativité.

Origine:
C'est l'un de ces irritants choses sur EF. Ne sera pas soutenir encore!

Ou vous pouvez faire quelque chose comme:

public MyEnum MyEnumProperty  
{  
  get { return (MyEnum) InnerEnumProperty; }  
  set { InnerEnumProperty = (int) value; }  
}

Mais il me fait me sentir sale.

11voto

Leniel Macaferi Points 38324

Cette question est un peu vieux, mais permettez-moi de vous diriger à un plus récent, car aujourd'hui, nous avons une version plus récente de l'Entity Framework:

Vidéo: Entity Framework 5 Enums et le Déplacement de la Solution de EF 4.3 par Julie Lerman

J'ai utilisé cette vidéo aujourd'hui pour rattraper enums dans l'Entity Framework. C'est une grande étape par étape de démonstration. Espérons qu'il vous aide aussi.

Il y a aussi ce post d'introduction à Entity Framework de Conception de blog:

L'énumération de Soutien dans le Cadre de l'Entité

6voto

MemeDeveloper Points 1513

Je fais un usage intensif de tables (avec les valeurs par défaut) en DB de la forme

CREATE TABLE [dbo].[CommunicationPreferences]
(
    [ID] smallint NOT NULL,
    [SystemName] nvarchar(50) NOT NULL,
    [Description] nvarchar(200) NOT NULL,
)

Et je conduis ma EF4 entités à partir de la DB.

N. B. je n'utilise pas de points de vue, SPROCS ou des fonctions SQL, pas de complexes EF types, il suffit de les diriger table de l'entité de cartographie. Puis l'étendre mon entité classes partielles pour ajouter des fonctionnalités supplémentaires pour garder les choses SÈCHES.

Pour les Énumérations, j'ai un simple modèle T4, j'ai la main une liste de tables (de la forme ci-dessus), l' .tt fichier est tiré à chaque fois que je mettre à jour le modèle EF de la DB (ou si j'en ai besoin à la demande), il saisit les données, et construit les Énumérations, par exemple

/// <summary> 
/// Enums For The dbo Schema
/// </summary>
public enum CommunicationPreferencesList : short
{
    /// <summary> 
    /// HTML Emails
    /// </summary>
    [EnumTextValue(@"HTML Emails")]
    HTMLEmail = 1,

    /// <summary> 
    /// Plain Text Emails
    /// </summary>
    [EnumTextValue(@"Plain Text Emails")]
    PlainEmail = 2,

    /// <summary> 
    /// Mobile Telephone
    /// </summary>
    [EnumTextValue(@"Mobile Telephone")]
    Mobile = 3,

    /// <summary> 
    /// Landline Telephone
    /// </summary>
    [EnumTextValue(@"Landline Telephone")]
    Landline = 4,

    /// <summary> 
    /// SMS
    /// </summary>
    [EnumTextValue(@"SMS")]
    SMS = 5,

}

Puis, quand j'ai affaire à un FK ID de la colonne et de la Propriété à une entité par exemple

Users.CommunicationPreferenceID

J'ai tout simplement jeté l'ID ou la enum pour la comparaison. par exemple

CommunicationPreferencesList usersPreference = (CommunicationPreferencesList)currentUser.CommunicationPreferenceID;

if(usersPreference == CommunicationPreferencesList.SMS)
{
//send SMS
}
else if(usersPreference == CommunicationPreferencesList.Mobile)
{
//ring the phone
}

J'ai ensuite quelques simples aides pour donner par exemple la EnumTextValue à partir d'un enum exemple par exemple

string chosenMethod = EntityHelper.GetEnumTextValue(CommunicationPreferencesList.Mobile);

 => "Mobile Telephone"

Je trouve cela simple, sans tracas, transparent, facile à utiliser, et pour ma part il fonctionne un régal et je suis heureux. Je ne vois pas la nécessité de masque totalement la valeur numérique dans la base de données / de l'entité à partir de la consommation de code, je suis très heureux de voter une ou l'autre des valeurs, et se retrouvent avec assez propre code lisible, plus le gentil petit plus de la EnumTextValue qui est généré à partir de l' [Description] champ dans la base de données.

0voto

J'ai eu un problème similaire et résolu que par l'écriture d'une extension sur l'entité par l'intermédiaire de la classe partielle mécanisme. J'ai juste ajouté une propriété qui ne le casting de champ DB déjà dans l'entité, dans notre cas, seulement un nombre entier.

Seul écueil est d'ajouter une option ignorer la sérialisation d'attribut, par exemple lors de l'utilisation en combinaison avec WCF.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X