Início > .NET > Entity Framework + Enumeration

Entity Framework + Enumeration

Pessoal, infelizmente nosso querido Entity Framework (EF) não suporta Enumeration (enum), mas não é por causa disso que vamos deixar de usá-los e com isso inventamos truques e artimanhas para fazer com que isso aconteça. 

Para trabalharmos com Enumeration no EF, eu conheço duas formas (e dei nome para elas ainda): 

1.       Encapsulamento de propriedade: é quando se cria um Scalar Property no EF e cria outra propriedade para encapsular essa. 

2.       Casting explicito: é quando se cria um Scalar Property no EF e usa o enum usando casting e tendo que adivinhar que existe um enum para aquela propriedade. 

Bem, agora vamos explanar um pouco mais com passo a passo, vantagens e desvantagens desses dois métodos. Para isso vamos simular um cenário. 

Nosso cenário será de um alimento que pode ser de três tipos, de acordo com o diagrama abaixo. 

Com o objetivo definido vamos ao trabalho. Nos métodos citados irei focar mais na solução do EF com Enumeration, irei considerar que todos saibam criar um EDMX, caso não saibam leia o post http://www.desenvolvendoparaweb.net/profiles/blogs/crud-com-entity-framework. 

Encapsulamento de propriedade

Vantagens:  

·         O programador codifica como codificava antes. 

·         Obriga a propriedade informar uma Enumeration. 

Desvantagens 

·         Foge do padrão de nomenclatura no EF. 

·         Infere a integridade da classe como está no modelo. 

Passo a passo 

1.       Crie sua Enumeration TipoAlimentoEnum como segue no código abaixo. 

public enum TipoAlimentoEnum : short
{
    Satvico = 1,
    Rajasico = 2,
    Tamasico = 3
} 

2.       Crie seu Entity Framework com a classe Alimento normalmente, mas na propriedade Tipo, crie em lowerCase e os atributos Getter e Setter com valor Private. 

 

  

3.       Crie uma classe partial de Alimento e implemente a propriedade Tipo (em CamelCase) como Enumeration. 

public partial class Alimento
{
    public TipoAlimentoEnum Tipo {
        get { return (TipoAlimentoEnum)this.tipo; }
        set { this.tipo = (short)value; }
    }
}

4.       Pronto, Agora é só testar. 

using (var ctx = new Model1Container())
{
    var alimento = new Alimento()
    {
        Descricao = "Cenoura",
        Tipo = TipoAlimentoEnum.Satvico
    };

    ctx.AddToAlimentoSet(alimento);
    ctx.SaveChanges();
}

  

Para as pessoas que utilizam POCO é basicamente a mesma coisa, a diferença é que o código da entidade ficará dessa forma: 

public partial class Alimento
{
    public virtual int AlimentoId { getset; }
    public virtual string Descricao { getset; }
    private virtual short tipo { getset; }

    public TipoAlimentoEnum Tipo
    {
        get { return (TipoAlimentoEnum)this.tipo; }
        set { this.tipo = (short)value; }
    }
}

Essa solução termina aqui e espero q tenham entendido. Agora vamos o próximo método. 

Casting explicito

Vantagens:  

·         Permanece com a nomenclatura das propriedades do EF. 

Desvantagens 

·         O programador deve adivinhar que tal propriedade existe uma Enumeration. 

·         Infere a integridade da classe como está no modelo. 

Passo a passo 

1.       Crie sua Enumeration TipoAlimentoEnum de acordo com o método anterior. 

2.       Crie seu Entity Framework com a classe Alimento normalmente de acordo com o método anterior. 

3.       Use a Enumeration com casting. 

using (var ctx = new Model1Container())
{
    //insere
    var alimento = new Alimento()
    {
        Descricao = "Cenoura",
        Tipo = (short)TipoAlimentoEnum.Satvico
    };

    ctx.AddToAlimentoSet(alimento);
    ctx.SaveChanges();
}

  

Os dois métodos de ser trabalhar com EF com Enumeration que eu conheço são esses, espero ter ajudado. 

Abraços.

Anúncios
Categorias:.NET Tags:, , ,
  1. 27/07/2010 às 10:21 pm

    Voce chegou a testar fazer “select” com esses seus exemplos? Nao tenho o VS aqui em casa pra testar, mas acho que nao vai funcionar com tenhum dos 2. Voce tera que declarar uma variavel short e usar ela pra fazer o filtro.

    De qualquer forma, parabens pelo post!

    Abraco
    @zote

  2. 28/07/2010 às 5:10 am

    Boa garoto 😀 vou testar essa dicas que você deu e depois coloco aqui o que achei 😀 valew pelo post vai ser útil para muita gente pode ter certeza 😀

    • 28/07/2010 às 10:36 am

      Olá Zote,
      Cheguei a testar sim, e se vc quiser posso te mandar o projeto teste que realizei. Talvez eu não tenha explicado direito, mas se vc reparar eu declarei no EF uma propriedade tipo, logo, o EF vai persistir essas propriedade sendo publica e privada. O que fiz posteriormente é encapsular essa propriedade tipo que é persistida pelo EF por uma outra propriedade, funcionaria como um wrapper. Eu uso e já usei esse dois métodos em meus projetos EF4, não tenho tido problemas.
      Abraço

  3. hrosko
    28/07/2010 às 9:46 am

    Boa Gustavo! Muito melhor do que a solução do devtalk, usando wrapper:
    http://devtalk.dk/CategoryView,category,EF4.aspx

  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: