Tipos Complexos com Code First

Olá pessoal, vamos dar continuidade sobre os posts do Code First, agora falando um pouco sobre Tipos Complexos (Complex Types).

1. Tipos Complexos

Tipos Complexos (Complex Types) é uma funcionalidade integrada do ADO.Net Entity Framework 4.1 que permite a composição de várias Classes de Domínio em uma única Tabela a ser persistida no banco de dadoss, por exemplo:, vejam a Figura 1:

Figura 1. Classes de Domínio

Conceito: Granularidade define o nível de detalhamento de uma aplicação, ou seja, Granularidade Grossa: indica que existirão poucas classes com uma grande quantidade de detalhes (Poucos grãos, porem grossos). Granularidade Fina: consiste em várias classes com pouco detalhamento (no nosso caso, propriedades).

O Diagrama acima mostra um alto nível de detalhamento no nosso conjunto de classes que compõem a entidade Cliente. Explodimos a classe Cliente em um conjunto de classes, agrupando o código que poderá se repetir em uma classe única e referenciando em uma propriedade, dessa forma nosso código se torna mais reutilizável e entendível.

Um detalhe importante é que a classe que irá compor um Complex Type não poderá ter identidade (por exemplo, TelefoneId). Segue abaixo na Listagem 1 o código que compõe nosso conjunto de classes.

using System;

namespace Entities
{
    public class Cliente
    {
        public int ClienteId { get; set; }
        public string Nome { get; set; }
        public Telefone TelefoneResidencial { get; set; }
        public Telefone TelefoneCelular { get; set; }
        public Telefone TelefoneTrabalho { get; set; }
        public Endereco Endereco { get; set; }
    }

    public class Telefone
    {
        public int CodigoArea { get; set; }
        public Int32 Numero { get; set; }
    }

    public class Endereco
    {
        public string Rua { get; set; }
        public int Numero { get; set; }
        public string Complemento { get; set; }
        public Int32 CEP { get; set; }
        public string Bairro { get; set; }
    }

}

Listagem 1. Código que compõe a Tipo Complexo Cliente

2.  Mapeando o Tipo Complexo

O mapeamento do Tipo Complexo é feito de forma similar a de qualquer outra classe que deverá ser persistida utilizando o Code First, Através do DbSet é informado a classe principal e definido seu nome, conforme mostra a Listagem 2.

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace Entities
{
    public class MyContext:DbContext
    {
        public DbSet<Cliente> Clientes { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

            base.OnModelCreating(modelBuilder);
        }
    }
}

3. Criando um Dado

Agora com o Tipo criado e  Mapeado, vamos criar o primeiro cliente de forma ao Code First mapear nosso Conjunto de Classes e criar os objetos necessários a serem persistidos no banco de dados (para maiores detalhes, ver postes anteriores).  Para isso vamos instanciar nossa classe de contexto, criar um novo banco de dados, depois criar um novo cliente e então salvar os dados. Segue código na Listagem 3.

using System;
using Entities;
namespace CodeFirstConsole
{
    class Program
    {
        static void Main(string[] args)
        {

            using (Entities.MyContext MyContext = new MyContext())
            {
                if (MyContext.Database.Exists())
                {
                    Console.WriteLine("BD existente, deletando...");
                    MyContext.Database.Delete();
                }
                Console.WriteLine("Criando BD");
                MyContext.Database.Create();

                MyContext.Clientes.Add(new Cliente()
                {
                    Nome = "Olavo Oliveira Neto",
                    Endereco = new Endereco() { Rua = "XXX", Bairro = "YYY", CEP = 00000000, Numero = 1 },
                    TelefoneCelular = new Telefone() { CodigoArea = 85, Numero = 123456789 },
                    TelefoneResidencial = new Telefone() { CodigoArea = 85, Numero = 987654321 },
                    TelefoneTrabalho = new Telefone() { CodigoArea = 85, Numero = 789654123 }
                });

                MyContext.SaveChanges();
                Console.WriteLine("Processo Terminando, Pressione qualquer tecla para fechar.");
                Console.Read();

            }
        }
    }
}

Após a execução do código, poderemos ver no banco de dados que foi criado uma tabela com a seguinte disposição:

Figura 2. Classe Cliente

Na Figura 2, é possivel ver que foi criado uma única tabela, que consiste em todas as classes do nosso Tipo Complexo Cliente.

Bom, isso foi só um pouco mais sobre Code First e Tipos Complexos.

Anúncios
Esse post foi publicado em Code First, Entity Framework, LINQ. Bookmark o link permanente.

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