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