Anúncios

EntityTypeConfiguration

Quando utilizamos a Fluent API para configuração do mapeamento de nosso banco de dados, corremos o risco de tornar o método OnModelCreating muito extenso e complexo.

Para evitar este cenário podemos criar uma classe que herde de EntityTypeConfiguration e que descreva qual a configuração de nosso mapeamento.

A classe EntityTypeConfiguration permite o mapeamento indvidual de nossas entidades, tornamos o comportamento de nosso método OnModelCreating mais simples e encapsulando o mapeamento de nossas entidades em classes próprias para isso.

A vantagem deste recurso é deixar o código mais simples, reutilizável e manutenível, sem permitir que um único método faça o mapeamento de todo um sistema, o que é bastante ruim.

Para começar faremos a criação de nossa entidade, no caso Customer:

public class Customer {
    public int Id { get; set; }

    public string Name { get; set; }

    public Guid GlobalId { get; set; }

    public Customer()
    {
        this.GlobalId = Guid.NewGuid();
    }
}

Em seguida, faremos a criação da classe que armazenará a configuração do mapeamento de nossa tabela e que irá herdar de EntityTypeConfiguration:

public class CustomerTypeConfiguration : EntityTypeConfiguration<Customer>
{
    public CustomerTypeConfiguration()
    {
        // Mapeando a tabela this.ToTable("tbCustomer");

        // Configurando a chave primária this.HasKey(c => c.Id);

        // Mapeando colunas this.Property(c => c.Id).HasColumnName("ctmId");
        this.Property(c => c.Name).HasColumnName("ctmName")
                                  .IsRequired();
        this.Property(c => c.GlobalId).HasColumnName("ctmGId")
                                      .IsRequired();
    }
}

obs.: veja que para habilitar o IntelliSence será preciso informar qual a classe que será mapeada através da realização da interface EntityTypeConfiguration atrelada ao tipo de destino, no caso Customer. Assim a implementação fica como: EntityTypeConfiguration<Customer>

E por fim, mas não menos importante, será preciso configurar nosso contexto de acesso a dados, para que as informações sejam pesquisadas e persistidas.

internal class EntityModel : DbContext
{
    public EntityModel()
        : base("")
    {
        // Definir inicializadores de banco de dados Database.SetInitializer<EntityModel>(null);
    }

    public DbSet<Customer> Customers { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add<Customer>(new CustomerTypeConfiguration());

        base.OnModelCreating(modelBuilder);
    }
}

Observe que dentro do método OnModelCreating é adicionada uma instância de nossa classe, responsável por configurar o mapeamento de nosso banco de dados para nossa tabela.

 

Este é o uso do EntityTypeConfiguration, uma ferramenta bastante funcional que nos ajuda a simplificar (e reaproveitar) o mapeamento de nossas entidades.

 

Por

Fernando Henrique Inocêncio Borba Ferreira

Microsoft Most Valuable Professional – Data Platform Development

Anúncios

6 Responses to EntityTypeConfiguration

  1. Pingback: Entity Framework Power Tools « Fernando Henrique Ferreira

  2. Ygor Thomaz says:

    Obrigado pela dica. Meu metodo esta ficando estranho realmente.

    Apenas uma pequena contribuicao para mais clean code, voce pode usar:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    modelBuilder.Configurations.Add(new CustomerTypeConfiguration());

    base.OnModelCreating(modelBuilder);
    }

    Sem o “” esta implicito. Abracos!

  3. Gustavo Américo says:

    Você poderia dar um exemplo de como mapear uma view atraves do Fluent API?
    vou deixar um exemplo das classes que possuo

    public class Pessoa{

    public int Id{get;set;}

    public string Nome {get;set;}

    pubilc virtual CertidaoNascimento Certidao{get;set;}

    }

    public class CertidaoNascimento {

    public int Id{get;set;}
    public string NRegistro {get;set;}

    public string Folha{get;set;}

    }

    Agora preciso mapear um objeto que contenha a propriedade das duas classes

    public class ViewDadosPessoa{

    public string NomePessoa{get}

    pubilc int PessoaId{get;}

    public string FolhaCertidao{get;}

    public string NRegistroCertidao{get;}

    }

    É possivel fazer isso usando Fluent API ? se sim como?

    *Meu contexto e objetos não se limita ao codigo acima, na verdade eu tenho umas 15 tabelas relacionadas e preciso usar algumas propriedades individuais ao mesmo tempo para não efetuar diversas consultas retornando poucos resultados criei uma View no banco e não sei com coloca-la na Fluent API

    • Olá Gustavo,
      Vc pode fazer isso de diferentes maneiras. Existem três cenários que vc pode mapear views, veja qual deles se adapta melhor a vc:

      Mapear um DbSet para uma view.
      modelBuilder.Entity().ToTable(“MY_VIEW”)

      Usar uma view para popular objetos
      var myEntity = dbContext.MyEntity.SqlQuery(“SELECT * FROM dbo.MY_VIEW”)

      Usar uma view para popular objetos que não estão no seu modelo
      var myNonModel = dbContext.Database.SqlQuery(“SELECT * FROM dbo.MY_VIEW”)

      No caso, eu criaria uma classe, cujos nomes das propriedades e os tipos de dados, sejam idênticos aos da view. E usaria o seguinte código para mapear essa view:

      var query = dbContext.Database.SqlQuery(“SELECT * FROM dbo.MY_VIEW”);

      O que acha?

      []s!

  4. Flávio says:

    ótimo. era o que eu precisava. Obrigado.

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: