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

6 comentários sobre “EntityTypeConfiguration

  1. […] https://ferhenriquef.com/2012/03/12/entitytypeconfiguration/Com o modelo criado, o Entity Framework Power Tools criará em seu projeto uma pasta chamada Models. A pasta Models irá conter todas as entidades criadas com base nas tabelas do seu banco de dados. Também será criada uma pasta chamada Mapping, que irá conter todas as classes de mapeamento dos seus campos. Essas classes de mapeamento herdam da classe EntityTypeConfiguration<T>, uma classe que já discutimos anteriormente (veja ). […]

  2. 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. 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!

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 )

Foto do Google

Você está comentando utilizando sua conta Google. 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 )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.