Arquivo

Posts Tagged ‘Entity Framework’

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:, , ,