web-dev-qa-db-fra.com

Comment utiliser une énumération existante avec Entity Framework DB First

J'utilise Entity Framework 5, DB en premier. Je sais comment définir une énumération sur mon modèle et définir le type d'un champ sur cette énumération.

Maintenant, j'ai besoin de mapper un champ MyField à une énumération définie en externe, c'est-à-dire pas dans le modèle EF (OtherNamespace.MyEnum). Le concepteur ne me permet pas de définir le type sur quoi que ce soit en dehors du modèle. J'ai essayé d'éditer le fichier edmx manuellement, mais cela provoque une erreur:

Erreur 10016: Erreur lors de la résolution de l'élément 'MyField'. Le message d'exception est: 'Référence non résolue' OtherNamespace.MyEnum '.'.

OtherNamespace.MyEnum est référencé par mon projet.

Comment faites-vous?

27
Shaul Behr

Cela peut être fait, mais cela nécessite un petit sacrifice du côté de la base de données. Entity Framework (à partir de 5) prend en charge le mappage d'un champ à une énumération, mais uniquement pour byte, sbyte, short, ushort, int, uint, long ou ulong.

Supposons que nous ayons l'exemple de tableau suivant:

CREATE TABLE [People](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Name] [varchar](50) NOT NULL,
    [Title] [int] NOT NULL
)

Title a été déclaré comme un entier. Dans une vraie base de données, il peut s'agir d'une clé étrangère vers une table TitleTypes.

Supposons également que l'énumération externe que nous allons lier soit définie comme:

namespace Enumerations
{
    public enum TitleEnum
    {
        Mr,
        Mrs,
        Dr,
        None
    }
}

Si nous importons la table People dans un EDMX, nous pouvons faire un clic droit sur la colonne Title et Convertir en Enum

Convert To Enum

Cela fera apparaître une boîte de dialogue nous permettant de spécifier un nom pour l'énumération dans l'EDMX ModelStore, définir toutes les valeurs pour l'énumération [~ # ~] ou [~ # ~] lien vers une énumération externe via Type externe de référence.

Donnez-lui un nom de type de TitleEnum, cochez Type externe de référence et tapez Enumerations.TitleEnum dans le champ prévu. Cliquez sur OK et il associera la colonne à l'énumération externe.

Remarque:

  • Alors que les deux sont appelés TitleEnum, cela agit comme un relais vers l'énumération externe
  • Le type de votre colonne et l'énumération externe DOIVENT correspondre

Linking the Enumeration

Maintenant, lorsque nous créons une nouvelle personne, nous pouvons utiliser l'énumération et elle sera traduite dans sa représentation Int.

Data.ScratchEntities context = new Data.ScratchEntities();
Data.Person person = new Data.Person();
person.Name = "Jane Smith";
//Note the use of the external enumeration here
person.Title = Enumerations.TitleEnum.Mrs;
context.People.Add(person);
context.SaveChanges();

Intellisense

52
cbeckner