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
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!
Olá Ygor!
Obrigado pela dica 😉
Obrigado por comentar!
[]s!
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!
ótimo. era o que eu precisava. Obrigado.