Modelo de Entity Framework Core: Database First e Code First

Modelo de Entity Framework Core: Database First e Code First

O que é Entity Framework Core?

Entity Framework é um ORM (Object-Relational Mapping) para .NET. Resumindo, com um ORM podemos mapear ou converter as tabelas e relacionamentos de nosso banco de dados em objetos de nosso sistema ou aplicação, deixando então de manipular o banco de dados a nível SQL para fazê-lo através de nosso código.

Entity Framework Core é cross-platform ou multi-plataforma, portanto funciona em Windows, Linux e Mac. Além disso, ele pode trabalhar com consultas nativas e LINQ, oferece suporte a rastreamento de alterações e migrações de esquema e é compatível com bancos de dados cruzados.

Você pode aprender mais aqui.

O modelo

Como diz a documentação oficial, o Entity Framework Core acessa os dados através de um modelo formado pelas entidades e um objeto de contexto, que representa a sessão do banco de dados e permite consultar e salvar os dados.

O modelo (espanhol)

Para gerar este modelo temos três opções:

  • Code First: primeiro criar o modelo (entidades e contexto). O banco de dados é gerado a partir do nosso código, usando migrações.
  • Database First: o modelo é gerado a partir de um banco de dados existente.
  • Manual: o modelo é codificado manualmente para corresponder a um banco de dados já existente.

A seguir, vou me aprofundar em Code First e Database First, mas para que você possa aplicá-lo em seu computador, você deve atender a estes requisitos:

  • Visual Studio instalado.
  • Base de datos. Para os exemplos usarei MariaDB com Xampp, mas você pode usar qualquer banco de dados que esteja na lista de Provedores de Banco de Dados para EF Core.

Migrações

As migrações nos permitem ter o modelo e nosso banco de dados sincronizados. Como os aplicativos estão em constante mudança ou aprimoramento, muitas vezes precisamos adicionar ou remover parâmetros em tabelas ou relacionamentos.

Com as migrações podemos carregar alterações incrementais. Portanto, se fizermos uma alteração no modelo, podemos sincronizá-lo com o banco de dados fazendo atualizações sem precisar excluir os dados existentes usando as ferramentas do console EF Core.

Para criar uma migração, use o comando > Add-Migration nomeDaMigração.

Observe que as migrações recebem um nome descritivo para facilitar a compreensão do histórico do projeto posteriormente.

Configurações iniciais

Para ambos modos usaremos como exemplo duas entidades, Book e Author, onde um autor pode ter muitos livros.

Criamos um novo projeto. Para os exemplos, criei uma solução ASP.NET Core Web API.

Instalamos os seguintes pacotes do nuget:

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Tools

Pomelo.EntityFrameworkCore.MySql

Para verificar se as tools do Entity Framework Core foram instaladas corretamente:

1) Abrimos o console do Gerenciador de Pacotes:

Tools -> Nuget Package Manager -> Package Manager Console

2) Executamos o seguinte comando:

Observaremos uma saída semelhante à da imagem.

Com todos esses conceitos e com as ferramentas instaladas, já podemos gerar nossos modelos.

Code First

Como mencionamos, para gerar o modelo com a opção Code First, primeiro criamos o modelo (entidades e contexto) e, com esse código por meio de migrações, geramos o banco de dados.

A seguir, criamos uma classe para autor e outra para livro:

Author.cs


Libro.cs

Essas classes têm três notações que podem ser novas para você. A primeira é Table, usada para vincular a classe à tabela no banco de dados. O outro é Key, usado para definir Id como primary key, além de defini-lo como obrigatório ou obrigatório com Required.

Com essas classes já temos a parte das entidades e podemos criar o contexto:

BookContext contém as entidades que criamos anteriormente. Através do DbSet os configuramos com o banco de dados e os habilitamos para que possamos realizar operações sobre eles.

Na função OnModelCreating definimos os relacionamentos que existem entre nossas entidades. Da mesma forma, na função OnConfiguring vamos configurar a string de conexão do nosso banco de dados. Por exemplo, para um banco de dados em MariaDb temos:

server=localhost; port=3306; database=bdauthors; user=root; password=;

No database, inserimos o nome do nosso banco de dados. Não importa se não existe: com a primeira migração ele será criado.

Para criar o banco de dados, precisamos gerar a migração. No console do Package Manager, executamos o comando:

> Add-Migration Initial

Para executar esses novos arquivos, no console do Package Manager, executamos o comando:

> Update-Database

Com este comando já criamos o banco de dados e as tabelas.

Se você alterar o modelo, basta criar outra migration e atualizá-la, assim você terá as alterações sem modificar as tabelas com SQL.

Database First

Para gerar o modelo com a opção Database First, geramos o modelo a partir de um banco de dados já existente. Esse processo é feito com o comando Scaffold-DbContext. Este comando irá gerar o código para o context e as entidades, recebendo como parâmetro a connection string do banco de dados existente, o provedor que é o nome do package nuget que estamos usando e também o nome da pasta onde queremos que gera o modelo. Você tem outras opções de parâmetros, mas essas são as mais importantes.

No console do Package Manager, executamos o comando:

> Scaffold-DbContext "server=localhost; port=3306; database=bdauthors; user=root; password=;" Pomelo.EntityFrameworkCore.MySql -OutputDir BookModel

Este comando irá gerar nosso modelo na pasta BookModel, onde estão localizadas as entidades e o contexto.

A partir deste modelo também podemos trabalhar com migrações.

Ambas as formas de criar o modelo permitirão que você automatize tarefas, seja criando o banco de dados ou codificando o modelo.

Escolher um ou outro depende muito da necessidade e do contexto do seu projeto, um projeto com poucas tabelas pode ser melhor trabalhar com código primeiro do que outro que tenha muitas tabelas com muitos relacionamentos entre elas, pode ser difícil gerenciá-lo apenas em código.

Avalie qual é a melhor opção para o seu projeto. Sucesso!

⚠️
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo.

A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.