Como criar um banco de dados usando Entity Framework (code first).

Marcio Nizzola
6 min readMar 16, 2023
Como criar um banco de dados usando Entity Framework (code first)

Neste arquivo repliquei material de uma aula sobre mapeamento de classe para utilização no Entity Framework que foi usado no projeto de alunos da Etec que eu ajudei a mapear.

A metodologia “Code-First” no .NET prevê com a utilização do ORM Entity Framework, que façamos o código antes de montar a base de dados.

E através do Entity Framework, seja feito o mapeamento das entidades e gerado o banco de dados relacional, podendo ser SQL Server, MySql ou outro banco de dados.

Então faremos um exemplo de mapeamento para explicar algumas formas de mapear as entidades, este foi um projeto elaborado numa aula onde fazia parte de um site de anúncios bem básico para testar o conceito do Entity Framework em mapear entidades.

O desenho das nossas entidades é o seguinte:

Entidade Cliente

Temos a entidade “Cliente”, que possui coleção de entidades que são ligadas à ela, que são representadas por coleções (ICollection) indicando que um cliente possui muitas destas entidades.

Entidade Endereço

A entidade “Endereço”, possui uma ligação com uma entidade “Cliente” podendo estar ligada à apenas 1 Cliente por vez, que é definida com 2 propriedades:

  • o inteiro “ClienteId” que refere-se ao código de um cliente.
  • a propriedade do tipo “Cliente” que será utilizada para fazer o vínculo com a entidade Cliente.

Podemos dizer que a relação de endereço x cliente, diz que :

Um endereço possui um cliente (1) por isso possui “ClienteId” em sua estrutura.

Um cliente possui vários endereços (0.n), que são definidos pela sua chave pertencente à um endereço.

Um detalhe importante é a presença da chave “ForeignKey” que indica que o próximo campo “ClienteId” é a chave para a propriedade “Cliente”, fazendo com que o Entity Framework possa carregar o cliente também quando carregarmos um endereço, associando-o ao Endereço.

Entidade Anúncio

Já a entidade “Anúncio”, possui a mesma forma de relacionamento, estando ligada à um Cliente, como podemos ver na figura abaixo

No caso acima, a chave “ForeignKey” indica que o próximo campo “AnuncianteId” é a chave estrangeira do elemento “Anunciante” que na verdade é uma classe do tipo “Cliente”.

Entidade Candidatura

Na entidade Candidatura temos um exemplo de 3 relações distintas que podem ser vistas na figura abaixo:

A — é a relação com o Anúncio (1 candidatura possui 1 anúncio)

B — é a relação com o Candidato (1 candidatura possui 1 candidato)

C — uma candidatura, possui uma lista de histórico

A anotação “ForeignKey” é utilizada para dizer que o campo que vem na sequência, é a chave estrangeira para relacionar-se à entidade citada entre aspas nesta anotação (o campo neste caso vem depois da chave como podem ver na figura “Anuncio” e “Candidato” e não são do tipo obrigatório, por isso a presença da interrogação dizendo que é um campo não obrigatório)

Entidade “CandidaturaHistorico”

Nesta entidade temos um outro cenário, onde ela possui vínculo com a Candidatura, esta entidade deve ser uma lista de itens onde será guardado o status em cada mudança que uma candidatura sofrer, para isto também iremos depois implementar uma forma de persistir dados automaticamente sempre que um status for alterado.

Veja que a relação dela é estabelecida através da Chave para a tabela de candidatura pelo campo “CandidaturaId” e ele possui uma propriedade do tipo “Candidatura”.

Portanto, após criada esta modelagem, podemos criar o banco de dados a partir dela.

Se utilizarmos Entity-Framework, podemos fazer através do processo de “Scaffolding” a modelagem do banco e criação, caso estejamos fazendo um projeto MVC ou API, senão podemos também fazer o contexto manualmente.

A grande jogada, para a criação do banco de dados, é a utilização de “Migrations” que permite a geração do código de criação das tabelas automaticamente pelo Entity-Framework, após analisar as relações entre as entidades (saiba mais sobre).

Onde podemos criar o nosso banco com o comando abaixo:

Observações: Já tive casos em que foi preciso instalar dependências via Nuget, caso tenha erro, tente instalar ! (Microsoft.VisualStudio.Web.CodeGeneration.Design e Microsoft.EntityFrameworkCore.Tools)

Quando fizermos o comando, será incluída uma pasta “Migrations” onde há o código fonte para a migração ser executada.

Cada vez que modificarmos a modelagem das nossas classe, devemos executar o comando “add-migration” com um nome que identifique a mudança que aplicamos.

Feita a migração, é hora de aplicar, temos 2 coisas aqui que podem ser feitas:

  • verificar como ficou o script do banco de dados : para isto, executando o comando no Package Manager Console
script-migration

Ou pelo prompt de comando (terminal)

dotnet ef migrations script -o ./script.sql 

Poderemos ver o script de criação daquele banco de dados.

script gerado pelo Entity Framework — Migrations

Um ponto importante é que no contexto, devemos realizar uma configuração manual, indicando que ação deverá ser tomada em caso de deleção da entidade base de um relacionamento.

Neste caso, fazemos um metodo que vai se chamar “OnModelCreating” com a opção “override” (que se sobrepõe a um método pré-existente) indicando as ações a serem tomadas.

Podemos ver no caso A, que um Endereço, possui um Cliente (HasOne), com vários “Endereços” (WithMany) e é indicado que no caso de deleção do item pai desta relação que é o Cliente, haverá Exclusão em Cascata, isto é definido pelo item “DeleteBehavior.ClientCascade”.

Podemos ter outras ações, que são definidas pelo Enum DeleteBehavior conforme exibido abaixo. (maiores informações consultar link)

Importante

Há outros meios de realizar o mapeamento de Chave Estrangeira (Foreign Key) que é através de código dentro do DbContext, tornando desnecessário utilizar a chave “ForeignKey” dentro da classe.

Podemos colocar diretamente dentro do contexto, no mesmo ponto onde colocamos as regras de restrição para exclusão, ou arquivos com as definições separadas para cada classe, o que é melhor do que poluir a classe com anotações.

Eu particularmente prefiro outra abordagem, então vou reescrever esse código para atendê-la.

Até por que, o quanto menos as classes ficarem poluídas com anotações é melhor para manutenção do código e legibilidade.

Mas isso será na Parte II…

Gostou do artigo? clique no ícone👏e me siga para ver as próximas publicações !!

Referências:

Código no Github (link)

--

--

Marcio Nizzola

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