Como criar um banco de dados usando Entity Framework (code first) — parte 2

Marcio Nizzola
4 min readSep 11, 2023
Como criar um banco de dados usando Entity Framework (code first) — parte 2

Para quem viu o mapeamento feito na postagem anterior (link), agora vamos fazer de uma forma mais profissional, utilizando “Fluent Api” do Entity Framework.

Para esta abordagem, não utilizaremos mais “Data Annotations” dentro da classe, deixando as classes de certa forma “poluidas”, como na postagem anterior foi realizado.

mapeamento de uma classe para banco de dados com Data Annotations

Teremos uma classe específica para mapeamento de cada entidade, colaborando também para manter as regras num único ponto, o que facilita a manutenção.

Então vamos limpar as nossas classes das anotações e criar classes para mapeamento, para isto, vamos criar uma pasta para melhor organização, onde estarão contidas estas classes.

E daí, onde eu vou configurar as propriedades do banco de dados?

Configurando com IEntityTypeConfiguration !

Vamos criar uma nova classe, que será responsável pela configuração apenas, veja que há detalhes na sua herança, onde “IEntityTypeConfiguration” (linha 7) é o que define que esta classe serve para fazer configurações, e tipamos entre os símbolos “< >” a classe que ela mapeia.

Criamos o método Configure que é responsável pela sua configuração de fato da entidade, onde temos:

linha 11 — builder.Totable = comando que define o nome da tabela.

linha 12 — Builder.Haskey = comando que indica qual é a chave primária

de 14 até 16, temos o mapeamento de propriedades de tipo string, definindo o tamanho de cada campo, e que eles são obrigatórios.

Porém, vemos que não há mapeamento nenhum para as entidades “Endereço”, “Anuncio” e “Candidatura” que estão associadas à cliente.

Este mapeamento deverá ocorrer, mas dentro de cada classe específica.

Veja como fica o mapeamento da classe de “Endereço”:

na linha 25, vemos o mapeamento entre “Cliente” e “Endereços”, onde é dito que o endereço possui um “Cliente”, que contém vários “Endereços”, com uma chave estrangeira “ClienteId” dentro da entidade “Endereço”, e um detalhe a mais, que é o comando “OnDelete” que especifica o que se deve fazer caso haja a deleção da entidade vinculada à esta classe, neste caso, escolhemos o “ClientCascade” que irá deletar em cascata os dependentes (se quiser saber mais pesquise neste item os tipos disponíveis).

Temos abaixo o mapeamento para a entidade “Anuncio”

Depois a entidade “Candidatura” onde vemos que possui mais vínculos com outras entidades definidos também !

Mas como a aplicação vai saber que essa configuração deve ser utilizada ? Teremos que alterar o nosso DbContext, veja o código:

namespace PortalAnuncios.Data;

public class PortalAnunciosContext : DbContext
{
public PortalAnunciosContext(DbContextOptions<PortalAnunciosContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);
}

public DbSet<ModelagemBd.Anuncio> Anuncio { get; set; } = default!;

public DbSet<ModelagemBd.Cliente>? Cliente { get; set; }

public DbSet<ModelagemBd.Endereco>? Endereco { get; set; }

public DbSet<ModelagemBd.Candidatura>? Candidatura { get; set; }

public DbSet<ModelagemBd.CandidaturaHistorico>? CandidaturaHistorico { get; set; }
}

Nele é criado o método “OnModelCreating” que é uma sobrecarga do método original do DbContext, e vai realizar a leitura das configurações, baseadas no “Assembly” da sua aplicação, isto reduz muitas linhas de código para tratar com somente uma:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);
}

Mas se você gosta de escrever código, poderia fazer assim:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new AnuncioConfiguration());
modelBuilder.ApplyConfiguration(new CandidaturaConfiguration());
modelBuilder.ApplyConfiguration(new CandidaturaHistoricoConfiguration());
modelBuilder.ApplyConfiguration(new ClienteConfiguration());
modelBuilder.ApplyConfiguration(new EnderecoConfiguration());
}

Portanto, feita a configuração do Contexto, o procedimento de criação da migration e update do banco de dados é o mesmo do post anterior (se não viu clique aqui).

E assim, suas entidades são configuradas de uma forma bem mais profissional e seu projeto ficará muito mais organizado !

Gostou do artigo? clique no ícone👏e me siga para ver as próximas publicações !! Quer ver mais conteúdos, acesse minhas redes através do Linktree: https://linktree.com/nizzola

Referência:

https://www.entityframeworktutorial.net/efcore/fluent-api-in-entity-framework-core.aspx

--

--

Marcio Nizzola

Microsoft MVP | Software Architect na CI&T | Prof. da Etec Itu | Membro Fundador da Comunidade Itu Developers.