Comment travailler avec Enums dans Entity Framework?

Quelle est la meilleure façon de travailler avec Enums dans Entity Framework?

Remarques: J’utilise EF 3 et Firebird.

Il y a une meilleure façon de le faire dans EF 4 . Malheureusement, cela ne fonctionnera pas dans EF 1.

Voici une autre approche .

Mise à jour: La prise en charge de l’énumération réelle a été ajoutée dans le CTP EF de juin 2011 .

Mettre à jour:
Entity Framework prend désormais en charge la nativité Enums.

Original:
C’est l’une de ces choses irritantes à propos d’EF. Ne le soutiendra pas encore!

Ou vous pouvez faire quelque chose comme:

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

Mais ça me rend sale.

Cette question est un peu ancienne, mais permettez-moi de vous indiquer un document plus récent, car nous avons aujourd’hui une nouvelle version d’Entity Framework:

Vidéo: Entity Framework 5 Enums et solution mobile d’EF 4.3 par Julie Lerman

J’ai utilisé cette vidéo aujourd’hui pour rattraper les enums dans Entity Framework. C’est une excellente démonstration étape par étape. J’espère que ça vous aide aussi.

Il y a aussi ce post d’introduction sur le blog Entity Framework Design:

Prise en charge de l’énumération dans Entity Framework

Je fais un usage intensif des tables (avec les valeurs par défaut) dans la firebase database du formulaire

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

Et je pilote mes entités EF4 à partir de la firebase database.

NB Je n’utilise aucune vue, SPROCS ou fonctions SQL, aucun type EF complexe, il suffit de diriger le tableau vers le mappage d’entités. Ensuite, étendez les classes partielles de mon entité pour append des fonctionnalités supplémentaires afin de garder les choses DRY.

Pour Enums j’ai un simple modèle T4, que je remets une liste de tables (du formulaire ci-dessus), le fichier .tt est déclenché chaque fois que je mets à jour le modèle EF de la firebase database (ou récupère les données et crée Enums, par exemple

 ///  /// Enums For The dbo Schema ///  public enum CommunicationPreferencesList : short { ///  /// HTML Emails ///  [EnumTextValue(@"HTML Emails")] HTMLEmail = 1, ///  /// Plain Text Emails ///  [EnumTextValue(@"Plain Text Emails")] PlainEmail = 2, ///  /// Mobile Telephone ///  [EnumTextValue(@"Mobile Telephone")] Mobile = 3, ///  /// Landline Telephone ///  [EnumTextValue(@"Landline Telephone")] Landline = 4, ///  /// SMS ///  [EnumTextValue(@"SMS")] SMS = 5, } 

Ensuite, quand je traite d’une colonne / propriété FK ID sur une entité, par exemple

 Users.CommunicationPreferenceID 

Je lance simplement l’ID ou l’énumération 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 aides simples pour par exemple donner à EnumTextValue à partir d’une instance enum, par exemple

 ssortingng chosenMethod = EntityHelper.GetEnumTextValue(CommunicationPreferencesList.Mobile); => "Mobile Telephone" 

Je trouve cela simple, sans tracas, transparent, facile à utiliser et pour mes besoins, cela fonctionne et je suis heureux. Je ne vois pas le besoin de masquer totalement la valeur numérique dans la firebase database / l’entité par rapport au code consommateur, je suis plutôt content de lancer l’une ou l’autre des valeurs et de finir avec un code lisible plutôt propre, plus le joli petit plus de la valeur EnumTextValue qui est générée à partir du champ [Description] de la firebase database.

J’ai eu un problème similaire et l’ai résolu en écrivant une extension sur l’entité via le mécanisme de classe partielle. Je viens d’append une propriété qui fait le casting du champ DB déjà dans l’entité, dans notre cas, juste un entier.

Le seul inconvénient est d’append un atsortingbut de sérialisation ignoré, par exemple lors de l’utilisation en combinaison avec WCF.