Quando construímos aplicativos corporativos baseados em banco de dados, geralmente queremos isolar nossos modelos de entidade, o DbContext e a lógica de inicialização e migração do banco de dados para manter uma arquitetura limpa. Podemos fazer isso aproveitando a abordagem Code First no Entity Framework Core.

Este artigo apresenta uma discussão sobre a abordagem Code First no EF Core com exemplos de código para ilustrar os conceitos. Para usar os exemplos de código fornecidos neste artigo, você deve ter o Visual Studio 2022 instalado em seu sistema. Se ainda não tiver uma cópia, você pode baixar o Visual Studio 2022 aqui.

Crie um projeto de API Web ASP.NET Core no Visual Studio

Para criar um projeto de API Web ASP.NET Core no Visual Studio 2022, siga as etapas descritas abaixo.

  1. Inicie o IDE do Visual Studio 2022.
  2. Clique em “Criar novo projeto”.
  3. Na janela “Criar novo projeto”, selecione “API Web ASP.NET Core” na lista de modelos exibida.
  4. Clique em Avançar.
  5. Na janela “Configure seu novo projeto”, especifique o nome e o local do novo projeto.
  6. Opcionalmente, marque a caixa de seleção “Colocar solução e projeto no mesmo diretório”, dependendo de suas preferências.
  7. Clique em Avançar.
  8. Na janela “Informações adicionais” mostrada a seguir, selecione “.NET 8.0 (Long Term Support)” como a versão da estrutura e certifique-se de que a caixa “Usar controladores” esteja marcada. Não usaremos APIs mínimas neste projeto.
  9. Em outra parte da janela “Informações adicionais”, deixe “Tipo de autenticação” definido como “Nenhum” (o padrão) e certifique-se de que as caixas de seleção “Ativar suporte à API aberta”, “Configurar para HTTPS” e “Ativar Docker” permaneçam desmarcadas. Não usaremos nenhum desses recursos aqui.
  10. Clique em Criar.

Usaremos este projeto de API Web do ASP.NET Core para trabalhar com o EF Core e a abordagem Code First nas seções abaixo.

Criando um modelo de entidade no EF Core

O EF Core da Microsoft é um mapeador de banco de dados de objetos que simplifica o acesso a dados para aplicativos .NET Core. O EF Core funciona com bancos de dados relacionais, bancos de dados não relacionais e até mesmo bancos de dados na memória, e nos permite escrever código para realizar operações CRUD (criar, ler, atualizar, excluir) que usam objetos .NET. Ao usar o EF Core, não precisamos interagir diretamente com o provedor de banco de dados subjacente.

O EF Core oferece suporte a três abordagens diferentes para criar o modelo de entidade: Code First, Model First e Database First.

A abordagem Code First no EF Core

Na abordagem Code First, o modelo de entidade é definido usando código sem nenhum esquema de banco de dados pré-existente. Os desenvolvedores escrevem classes de domínio e configuram o mapeamento entre essas classes e o banco de dados usando atributos, APIs fluentes ou convenções. O EF Core então cria o esquema do banco de dados com base no modelo definido pelo código. A abordagem Code First permite expressar relacionamentos complexos usando código. Geralmente é preferido quando o esquema do banco de dados não está disponível.

A abordagem Model First no EF Core

Na abordagem Model First, o modelo de entidade é projetado usando uma ferramenta de design visual, como o Entity Framework Designer no Visual Studio. Com o designer, os desenvolvedores podem criar visualmente entidades, relacionamentos e outros aspectos de um modelo de dados sem escrever uma única linha de código. Depois de definir o modelo, o EF Core gera o código, incluindo as classes de entidade e as configurações de mapeamento. Posteriormente, você poderá estender o código para adicionar lógica de negócios ou personalizações conforme apropriado. O Model First pode ser benéfico quando não desenvolvedores estão envolvidos na definição do modelo de dados ou quando um esquema de banco de dados existente precisa passar por engenharia reversa.

A abordagem Database First no EF Core

Na abordagem Database First, um esquema de banco de dados existente é usado para gerar o modelo de entidade usando ferramentas EF Core. Essas ferramentas podem gerar classes de entidade e configurações de mapeamento por meio de engenharia reversa do esquema do banco de dados. Também é possível sincronizar alterações no esquema do banco de dados com o modelo de entidade. Quando os desenvolvedores usam a abordagem Database First, eles ganham mais controle sobre a estrutura do banco de dados, mas menos controle sobre o modelo de código. Essa abordagem é uma boa opção ao integrar o EF Core a um banco de dados existente ou ao trabalhar com bancos de dados legados.

Usando a abordagem Code First no EF Core

Antes de poder usar o EF Core em seu aplicativo, você deve adicionar o pacote Microsoft.EntityFrameworkCore ao seu projeto. Para fazer isso, selecione o projeto na janela Solution Explorer, clique com o botão direito e selecione “Gerenciar pacotes NuGet”. Na janela NuGet Package Manager, procure o pacote Microsoft.EntityFrameworkCore e instale-o.

Como alternativa, você pode instalar o pacote por meio do console do NuGet Package Manager digitando o comando abaixo.

PM> Install-Package Microsoft.EntityFrameworkCore

Com isso resolvido, vamos agora criar um modelo de dados usando a abordagem Code First no EF Core. Faremos isso em cinco etapas: definir as classes de domínio, criar a classe DbContext, configurar o DbContext, registrar o DbContext e, finalmente, migrar o banco de dados.

Etapa 1: Defina suas classes de domínio

Comece criando as classes de domínio que correspondem às entidades do seu aplicativo. O trecho de código a seguir define uma classe Author e seus membros.

public class Author
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
}

Etapa 2: crie a classe DbContext

Crie uma classe que estenda a classe DbContext do EF Core. Esta classe representa o contexto do seu banco de dados e é a porta de entrada para todas as comunicações entre sua aplicação e o banco de dados. Em outras palavras, a classe DbContext atua como ponto de entrada para realizar operações CRUD nos dados.

public class AuthorDbContext : DbContext
{
    public DbSet<Author> Authors { get; set; }
    public AuthorDbContext(DbContextOptions<AuthorDbContext> options)
        : base(options)
    {
    }
}

Observe como a instância DbContextOptions é passada para o construtor desta classe. Esta instância conterá o provedor de banco de dados e as informações da cadeia de conexão que seu aplicativo precisa para se conectar ao banco de dados.

Etapa 3: configurar o DbContext

Em seguida, substitua o método OnModelCreating da sua classe AuthorDbContext para configurar o modelo e seus relacionamentos conforme mostrado no trecho de código abaixo.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Author>()
        .Property(p => p.FirstName).IsRequired().HasMaxLength(50);
}

Etapa 4: registrar o DbContext

Agora registre o AuthorDbContext com o contêiner de injeção de dependência usando o seguinte trecho de código. Isso permitirá que seu aplicativo acesse a instância DbContext durante todo o seu ciclo de vida.

builder.Services.AddDbContext<AuthorDbContext>(options =>     
options.UseSqlServer(Configuration.GetConnectionString("AuthorDb")));

Etapa 5: migrar o banco de dados

Nesta etapa final aproveitamos o recurso de migração do EF Core para criar ou atualizar o esquema do banco de dados com base em nosso modelo de dados. Para fazer isso, execute o seguinte comando na janela CLI do EF Core ou no console do NuGet Package Manager.

dotnet ef migrations add InitialMigration

E isso é tudo que você precisa fazer para colocar seu aplicativo em funcionamento usando a abordagem Code First.

Cada uma das três abordagens para criar um modelo de dados no EF Core tem seus prós e contras. Você deve selecionar a abordagem correta para sua aplicação, dependendo dos requisitos. Discutirei as outras duas abordagens, Model First e Database First, em detalhes em postagens futuras aqui.