Configurando EF

Entity Framework (EF)

Criar um diretório Data destinado aos assuntos relacionados ao acesso a dados e definir o AppDbContext, herdando de DbContext, utilizando os primary constructors do C# 12. O DbContextOptions, denominado options, deve ser restrito ao AppDbContext e repassado ao construtor da classe base.

using Microsoft.EntityFrameworkCore;

namespace RepositoryStore.Data;

public class AppDbContext
    (DbContextOptions<AppDbContext> options) : DbContext(options)
{
    
}

Declarar o DbSet da entidade Product, denominado Products. Para evitar warnings, utiliza-se o operador null! (null-forgiving). Dessa forma, sempre que o DbContext for instanciado, a coleção de produtos estará disponível.

Configurar o mapeamento da entidade Product para definir explicitamente a tabela no banco de dados, evitando que o Entity Framework realize essa criação de forma automática.

No método OnModelCreating, pode-se configurar o ModelBuilder utilizando ApplyConfigurationsFromAssembly, passando typeof(Program) como referência à raiz da aplicação, de modo que todas as configurações presentes no assembly sejam aplicadas automaticamente.

AppDbContext.cs

Feito isso, criar o diretório Mapping dentro do diretório Data e criar a classe ProductMap que implementar a interface IEntityTypeConfiguration<Product> com a possibilidade de fazer a configuração no método Configure.

Data/Mapping/ProductMap.cs

Com isso pode-se partir para o Migrations e a configuração do DbContext no Program

Explicação ponto a ponto

AppDbContext – Estrutura e responsabilidades

Esses using e o namespace indicam que a classe utiliza o Entity Framework Core e depende do modelo de domínio Product, além de estar organizada na camada de acesso a dados.

Definição do DbContext com Primary Constructor

O AppDbContext herda de DbContext e utiliza primary constructor, recurso introduzido no C# 12.

  • DbContextOptions<AppDbContext> contém as configurações necessárias para o contexto (provider, string de conexão, comportamento, etc.).

  • O parâmetro options é repassado diretamente para o construtor da classe base (DbContext).

  • Essa abordagem reduz código cerimonial e mantém o construtor explícito e coeso.

Informações adicionais sobre o DbContext encontram-se na seção expansível abaixo.

Declaração do DbSet

Esse DbSet representa a coleção de entidades **Product** associada ao contexto.

  • Permite consultas, inserções, atualizações e remoções.

  • O operador null! (null-forgiving) é utilizado para evitar warnings de nulabilidade.

  • O EF garante que o valor será inicializado em tempo de execução, durante a criação do DBContext.

Informações adicionais sobre o DbSet encontram-se na seção expansível abaixo.

Configuração do modelo

O método OnModelCreating é sobrescrito para configurar o modelo de dados.

  • ApplyConfigurationsFromAssembly instrui o EF a localizar automaticamente todas as classes que implementam IEntityTypeConfiguration<T> no assembly informado, centralizando a configuração de mapeamentos das entidades.

  • typeof(Program).Assembly aponta para o assembly raiz da aplicação.

  • Isso elimina a necessidade de registrar manualmente cada mapeamento de entidade.

Essa abordagem centraliza e padroniza as configurações de mapeamento, mantendo o DbContext limpo e focado apenas em sua responsabilidade.

Perfeito. Abaixo está o mesmo conteúdo, apenas ajustado para usar headers como títulos, sem linhas separadoras, mantendo o tom formal e pronto para GitBook.

Resumo

Esse AppDbContext:

  • define o ponto central de acesso aos dados

  • utiliza recursos modernos do C# (primary constructors)

  • expõe entidades via DbSet

  • aplica mapeamentos de forma automática e organizada

  • mantém separação clara entre domínio e persistência

É uma implementação enxuta, explícita e alinhada com boas práticas de arquitetura.


ProductMap – Mapeamento da entidade Product

Os using indicam que a classe utiliza recursos do Entity Framework Core para configuração de mapeamentos e depende diretamente da entidade de domínio Product .

O namespace RepositoryStore.Data.Mapping organiza a classe como parte da camada de infraestrutura responsável exclusivamente pelo mapeamento objeto-relacional, mantendo essa responsabilidade separada do domínio e do DbContext.

Definição da classe de mapeamento

A classe ProductMap implementa a interface IEntityTypeConfiguration.

Essa interface define um contrato para configuração do mapeamento da entidade Product.

Ao seguir esse padrão, o Entity Framework consegue identificar automaticamente essa configuração quando ApplyConfigurationsFromAssembly é utilizado no DbContext.

Essa abordagem evita configurações diretas no DbContext e mantém o mapeamento isolado, organizado e reutilizável.

Método Configure

O método Configure é exigido pela interface IEntityTypeConfiguration.

O parâmetro EntityTypeBuilder fornece a API fluente necessária para definir como a entidade Product será mapeada para o banco de dados.

Todas as configurações de tabela, chave primária, colunas e restrições são feitas nesse ponto.

Definição da tabela

Define explicitamente o nome da tabela no banco de dados como Product.

Essa configuração evita que o Entity Framework gere automaticamente nomes baseados em convenções.

Garante maior controle e previsibilidade sobre o schema de persistência.

Definição da chave primária

Define a propriedade Id como chave primária da entidade. Essa configuração reforça explicitamente a identidade da entidade Product no banco de dados.

Embora o EF possua convenções, declarar a chave de forma explícita melhora a legibilidade e reduz ambiguidades.

Configuração da propriedade Title

Essa configuração define como a propriedade Title será persistida:

  • IsRequired(true) determina que a coluna não aceita valores nulos.

  • HasMaxLength(160) define o tamanho máximo permitido no banco de dados.

  • HasColumnType("NVARCHAR") especifica explicitamente o tipo da coluna, garantindo compatibilidade e controle sobre o schema.

Essas regras traduzem restrições de domínio e persistência de forma centralizada e explícita.

Resumo

Esse ProductMap:

  • define o mapeamento da entidade Product de forma clara

  • isola regras de persistência fora do domínio

  • permite descoberta automática pelo DbContext via ApplyConfigurationsFromAssembly

  • evita código cerimonial no DbContext

  • reforça a separação entre domínio, infraestrutura e persistência

Esse padrão mantém o domínio limpo, o DbContext enxuto e a infraestrutura bem organizada — o jeito clássico de construir algo que envelhece bem.

Mais informações:

DBContext

DbContext

O DbContext é o componente central do Entity Framework Core responsável por gerenciar a comunicação entre a aplicação e o banco de dados. Ele representa uma sessão de trabalho com a base, coordenando consultas e persistência de dados.

Responsabilidades principais

O DbContext atua como infraestrutura de acesso a dados:

  • Gerencia a conexão com o banco

  • Materializa entidades a partir do banco

  • Rastreia alterações nas entidades

  • Persiste mudanças com SaveChanges

  • Aplica mapeamentos entre entidades e tabelas

Ele não contém regras de negócio.

Relação com Unit of Work

O DbContext funciona como uma implementação implícita do padrão Unit of Work, garantindo que várias alterações sejam persistidas de forma consistente em uma única operação.

DbContext e DbSet

As propriedades DbSet<T> representam coleções de entidades e permitem realizar consultas e operações de persistência. Elas são usadas internamente pelo repositório e não devem vazar para o domínio.

Papel arquitetural

  • Pertence à camada de infraestrutura

  • É usado por repositórios concretos

  • Não deve ser referenciado pelo domínio

  • Não deve aparecer em contratos de negócio

DbContext no Repository Pattern

No Repository Pattern, o DbContext é um detalhe de implementação. Ele serve ao repositório, mas não define o contrato da aplicação.

Conclusão

O DbContext resolve problemas técnicos de persistência. Quando mantido na infraestrutura, protege o domínio e mantém a arquitetura estável.

DBSet

DbSet

O DbSet representa uma coleção de entidades associadas a uma tabela ou origem de dados no banco. Ele é o principal ponto de interação do Entity Framework para consultar e persistir entidades específicas.

Papel técnico

Um DbSet<T> permite que o Entity Framework:

  • Execute consultas sobre uma entidade

  • Adicione, atualize e remova registros

  • Rastreie alterações nos objetos carregados

  • Traduza operações LINQ em comandos SQL

Na prática, ele funciona como uma porta de entrada para um tipo de entidade dentro do DbContext.

DbSet e DbContext

O DbSet vive dentro do DbContext:

  • O DbContext gerencia a sessão e o ciclo de vida

  • O DbSet representa o acesso a um tipo específico de entidade

Um não faz sentido sem o outro.

Papel arquitetural

  • Pertence à infraestrutura

  • Está associado ao ORM

  • Não representa um conceito do domínio

  • Não deve aparecer em contratos de repositório

Quando DbSet é exposto fora da infraestrutura, ocorre vazamento de ORM.

DbSet no Repository Pattern

No Repository Pattern, o DbSet é um detalhe interno da implementação do repositório. Ele não substitui o repositório e não define a API do domínio.

Expor DbSet no domínio quebra o padrão e cria acoplamento com o Entity Framework.

Conclusão

O DbSet é uma abstração técnica do Entity Framework para acesso a dados. Seu papel é facilitar a persistência, não modelar o domínio. Mantê-lo restrito à infraestrutura é essencial para uma arquitetura saudável.

Atualizado