Migrações do EF Core

Resumo : neste tutorial, você aprenderá como usar as migrações do EF Core para sincronizar as alterações dos modelos no banco de dados.

Fluxo de migração do EF Core

Na prática, o esquema do banco de dados evoluirá com novos requisitos. Por exemplo, você pode criar uma nova tabela ou modificar uma tabela existente adicionando ou removendo colunas .

Normalmente, você precisa realizar todas essas tarefas manualmente, executando comandos SQL no banco de dados.

Felizmente, o recurso de migração do EF Core facilita esse fluxo, permitindo fazer alterações nos modelos, gerar o script com base nas alterações e aplicá-las ao banco de dados.

Este é o fluxo de migração:

  • Primeiro, crie ou modifique modelos de entidade em C#.
  • Segundo, execute um comando de migração para gerar um arquivo ou script de migração com base nas alterações do modelo.
  • Terceiro, aplique a migração ao banco de dados para atualizar o esquema do banco de dados.

Observe que antes de executar os comandos de migração, você precisa instalar o Microsoft.EntityFrameworkCore.Toolspacote do Pacote NuGet.

Executando comandos de migração do EF Core

Depois de instalar o pacote, você estará pronto para explorar os comandos de migração.

Comando de ajuda

Para visualizar todos os comandos disponíveis, execute o seguinte comando de ajuda no Package Manager Console (PMC):

get-help entityframeworkLinguagem de código:  JavaScript  ( javascript )

Ele mostrará a seguinte saída (trecho):

O Get-Helpcomando mostra todos os comandos disponíveis no Entity Framework Core. Para obter ajuda sobre um comando específico, você passa esse comando para o Get-Helpcomando assim:

Get-Help command

Por exemplo, você pode usar o Get-Helpcomando para exibir a ajuda do Add-Migrationcomando:

get-help add-migrationLinguagem de código:  JavaScript  ( javascript )

Saída:

Adicionando a primeira migração

Para criar uma migração, você usa o Add-Migrationcomando. O requisito mínimo do Add-Migrationcomando é um nome de migração.

Por exemplo, o seguinte cria uma nova migração chamada Initial:

Add-Migration InitialLinguagem de código:  texto simples  ( texto simples )

O comando retornará a seguinte saída, indicando que a migração foi criada com sucesso:

Build started...
Build succeeded.
To undo this action, use Remove-Migration.Linguagem de código:  texto simples  ( texto simples )

Se você visualizar o projeto de RH, verá o Migrationsdiretório criado. O Migrationsdiretório possui dois arquivos:

20230608062832_Initial.cs– começa com um carimbo de data/hora e é seguido pelo nome da migração. O arquivo de migração define uma classe parcial que estende a Migrationclasse. Normalmente, o nome da classe é igual ao nome da migração, que está Initialneste exemplo.

A Initialclasse possui dois métodos Up()e Down().

  • O Up()método usa MigrationBuilderpara criar e gerenciar objetos de banco de dados, como criar tabelas e adicionar/remover colunas com base no modelo.
  • O Down()método inverte o Up()método. Se o Up()método criar uma tabela, Down()ele a eliminará.

O EF Core usa o Up()método para aplicar uma migração e o Down()método para revertê-la.

HRContextModelSnapshot.cs– O EF Core usará o arquivo de snapshot durante as migrações subsequentes. Mais especificamente, o EF Core usará o arquivo de snapshot para comparar o estado atual dos modelos com o snapshot anterior e gerará os scripts de migração para atualizar o esquema do banco de dados de acordo.

Observe que os arquivos no Migrationsdiretório podem fazer parte do controle de origem como o git. Isso significa que você pode gerenciar suas versões sincronizadas com a base de código.

O EF Core usa as seguintes convenções de mapeamento para nomear tabelas e colunas:

  • Os nomes DBSet são os nomes das tabelas.
  • Os nomes das propriedades de classe são nomes de colunas.

Aplicando uma migração

Para aplicar uma migração ao banco de dados, você usa o Update-Databasecomando. Ele fará o seguinte:

  • Lê o arquivo de migração.
  • Gera SQL na memória.
  • Cria o banco de dados se ele não existir.
  • Executa SQL no banco de dados.

Para gerar apenas o arquivo de script SQL, você usa o Script-Migrationcomando:

  • Lê o arquivo de migração.
  • Gera SQL na memória.
  • Exibe SQL no editor.
  • Usa parâmetros para direcionar nomes de arquivos, etc.

É recomendado usar o Update-Databasecomando no banco de dados de desenvolvimento enquanto usa Script-Migrationno banco de dados de produção.

Executaremos o Script-Migrationcomando primeiro para visualizar o script SQL gerado:

Script-Migration

Ele exibirá o seguinte código SQL no Editor do Visual Studio:

IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
    CREATE TABLE [__EFMigrationsHistory] (
        [MigrationId] nvarchar(150) NOT NULL,
        [ProductVersion] nvarchar(32) NOT NULL,
        CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
    );
END;
GO

BEGIN TRANSACTION;
GO

CREATE TABLE [Departments] (
    [Id] int NOT NULL IDENTITY,
    [Name] nvarchar(max) NOT NULL,
    CONSTRAINT [PK_Departments] PRIMARY KEY ([Id])
);
GO

CREATE TABLE [Employees] (
    [Id] int NOT NULL IDENTITY,
    [FirstName] nvarchar(max) NOT NULL,
    [LastName] nvarchar(max) NOT NULL,
    [JoinedDate] datetime2 NOT NULL,
    [DepartmentId] int NULL,
    CONSTRAINT [PK_Employees] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Employees_Departments_DepartmentId] FOREIGN KEY ([DepartmentId]) REFERENCES [Departments] ([Id])
);
GO

CREATE INDEX [IX_Employees_DepartmentId] ON [Employees] ([DepartmentId]);
GO

INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
VALUES (N'20230608062832_Initial', N'7.0.5');
GO

COMMIT;
GO

Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Observe que antes de aplicar a migração ao banco de dados, precisamos excluir o banco de dados de RH existente criado no tutorial anterior .

Agora, você pode aplicar as migrações para criar um novo banco de dados e tabela executando o seguinte comando no PMC:

Update-DatabaseLinguagem de código:  texto simples  ( texto simples )

O EF Core criará o banco de dados de RH e as seguintes tabelas:

  • __EFMigrationsHistory– armazena a migração que foi aplicada ao banco de dados para que o esquema do banco de dados permaneça sincronizado com os modelos.
  • Departments– mapeia para a Departmentclasse do modelo.
  • Employees– mapeia para a Employeeclasse do modelo.

O seguinte mostra o conteúdo da __EFMigrationHistorytabela:

Criando uma nova migração

Suponha que você precise de uma propriedade chamada DateOfBirthpara a Employeeclasse e sincronize-a com o banco de dados. Para fazer isso, você segue estas etapas:

Primeiro, defina a DateOfBirthpropriedade na Employeeclasse:

namespace HR;


public class Employee
{
    public int Id { get; set; }
    public required string FirstName {  get; set; }
    public required string LastName {  get; set; }
    public required DateTime DateOfBirth  { get;set; }
    public required DateTime JoinedDate { get; set; }
    public Department? Department {  get; set; }
}
Linguagem de código:  C#  ( cs )

Segundo, crie uma nova migração usando o Add-Migrationcomando:

 Add-Migration EmployeeDOBLinguagem de código:  texto simples  ( texto simples )

Saída:

Build started...
Build succeeded.
To undo this action, use Remove-Migration.Linguagem de código:  texto simples  ( texto simples )

O comando cria um novo arquivo de migração no Migrationsdiretório:

20230608063613_EmployeeDOB.csLinguagem de código:  texto simples  ( texto simples )

Observe que seu carimbo de data/hora será diferente. Aqui está o conteúdo do arquivo:

using System;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace HR.Migrations
{
    /// <inheritdoc />
    public partial class EmployeeDOB : Migration
    {
        /// <inheritdoc />
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<DateTime>(
                name: "DateOfBirth",
                table: "Employees",
                type: "datetime2",
                nullable: false,
                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
        }

        /// <inheritdoc />
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "DateOfBirth",
                table: "Employees");
        }
    }
}
Linguagem de código:  C#  ( cs )

O Up()método adiciona uma nova coluna à Employeestabela enquanto o Down()método elimina a coluna dela.

Terceiro, execute o Update-Databasecomando para aplicar a migração ao banco de dados:

Update-DatabaseLinguagem de código:  texto simples  ( texto simples )

Ele sincronizará as alterações no banco de dados. Se você visualizar a Employeestabela, verá a nova DateOfBirthcoluna:

Resumo

  • Use o fluxo de migração do EF Core para aplicar alterações de modelos ao banco de dados.
  • Use o Add-Migrationcomando para criar uma nova migração.
  • Use o Update-Databasecomando para aplicar uma migração ao banco de dados.
  • Use o Script-Migrationcomando para gerar um arquivo de script SQL.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *