2009-10-06 7 views

Répondre

19

Mise à jour:
Entity Framework prend désormais en charge la numération Enums.

Original:
C'est une de ces choses irritantes sur EF. Je ne vais pas le supporter pour le moment!

Ou vous pouvez faire quelque chose comme:

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

Mais ça me fait sentir sale.

+2

Je connaissais déjà cette solution de contournement , et ça ressemble vraiment à de la terre. Mais ... –

+2

c'est un peu sale, mais il y a un autre problème, si vous utilisez ce champ dans une requête, EF se plaindra. Pour ce problème, j'ai créé ce wrapper: http://landman-code.blogspot.com/2010/08/adding-support-for-enum-properties-on.html qui de l'extérieur de votre entité vous permet de rester propre de EF détails .. –

27

There is a somewhat better way to do it in EF 4. Malheureusement, il ne fonctionnera pas dans EF 1.

est ici another approach.

Mise à jour:réel support ENUM a été ajouté à the June 2011 EF CTP.

+0

l'autre approche fonctionne pour EF1 et EF4 btw. –

+0

Cette mise à jour fait référence à EF5? –

+1

@ Michel, [oui, vous pouvez le faire dans EF 5] (http://msdn.microsoft.com/en-us/data/hh859576.aspx). –

6

Je fais un usage intensif des tables (avec des valeurs par défaut) dans le 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 mes entités EF4 de la DB.

N.B. Je n'utilise pas de vues, de fonctions SPROCS ou SQL, pas de types EF complexes, je ne fais que diriger le mappage de tables vers des entités. Puis étendre mes classes partielles d'entité pour ajouter des fonctionnalités supplémentaires pour garder les choses DRY. Pour Enums J'ai un simple template T4, que je remets une liste de tables (du formulaire ci-dessus), le fichier .tt se déclenche chaque fois que je mets à jour le modèle EF de la BD (ou si j'en ai besoin sur demande), il saisit les données et construit Enums 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, 

} 

Ensuite, lorsque j'ai affaire à une colonne/propriété FK ID sur une entité, par ex. J'ai simplement cast l'ID ou l'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 alors quelques aides simples, par ex. donnez EnumTextValue à partir d'une instance enum par ex.

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

=> "Mobile Telephone" 

Je trouve ce simple, sans tracas, transparent, facile à utiliser, et pour mes fins, il fonctionne un régal et je suis heureux. Je ne vois pas la nécessité de masquer totalement la valeur numérique dans la DB/entité à partir du code la consommation, je suis très heureux de lancer une ou l'autre des valeurs, et se retrouver avec un code lisible assez propre, plus le joli petit extra de EnumTextValue qui est généré à partir du champ [Description] dans le DB.

+2

Idée intéressante. Il existe cependant des problèmes potentiels d'intégrité des données. Si vous supprimez/modifiez une entrée db existante et régénérez le modèle T4, le code utilisant l'énumération supprimée ne sera pas compilé. Et (pire) si quelqu'un supprime accidentellement une entrée db, puis la réinstalle, la clé peut être différente. Ensuite, toutes les valeurs enum enregistrées dans la base de données seraient associées au mauvais élément dans l'énumération (ou il n'y aurait pas de valeur correspondante). Peut-être faire l'inverse - persister l'enum à db pourrait être moins sujette aux erreurs? – Appetere

+0

Eh bien peut-être mais personnellement n'ai jamais eu de problèmes ... 1. Je n'utilise pas d'identité sur le col PK, donc incompatibilité avec ID incrémentation automatique tout simplement pas possible 2. Il ne fait pas de différence de quelle façon la persistance va ce qui compte, c'est que quelqu'un ne change pas l'un sans l'autre, ou qu'il y ait un mécanisme pour assurer la synchronisation, c.-à-d. que j'utilise un script sql automatique de valeurs par défaut pour définir les données de la table de recherche./DB publie 4. nous voudrions que le code utilisant l'entrée supprimée ne compile pas. Exactement ! – MemeDeveloper

11

Cette question est un peu vieux, mais permettez-moi de vous indiquer un matériau plus récent depuis aujourd'hui, nous avons une version plus récente de Entity Framework:

Video: Entity Framework 5 Enums and Moving Solution from EF 4.3 par Julie Lerman

je cette vidéo aujourd'hui rattraper enums dans Entity Framework. C'est une belle démonstration étape par étape. J'espère que cela vous aide aussi.

Il y a aussi ce post d'introduction sur le blog Entity Framework Conception:

Enumeration Support in Entity Framework

0

J'ai eu un problème similaire et a résolu le problème en écrivant une extension de l'entité à travers le mécanisme de la classe partielle. Je viens d'ajouter une propriété qui fait déjà couler le champ DB dans l'entité, dans notre cas juste un entier. Seul un piège consiste à ajouter un attribut de sérialisation ignoré, par exemple lors de l'utilisation en combinaison avec WCF.