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.Tools
pacote 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 entityframework
Linguagem de código: JavaScript ( javascript )
Ele mostrará a seguinte saída (trecho):
O Get-Help
comando 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-Help
comando assim:
Get-Help command
Por exemplo, você pode usar o Get-Help
comando para exibir a ajuda do Add-Migration
comando:
get-help add-migration
Linguagem de código: JavaScript ( javascript )
Saída:
Adicionando a primeira migração
Para criar uma migração, você usa o Add-Migration
comando. O requisito mínimo do Add-Migration
comando é um nome de migração.
Por exemplo, o seguinte cria uma nova migração chamada Initial
:
Add-Migration Initial
Linguagem 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 Migrations
diretório criado. O Migrations
diretó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 Migration
classe. Normalmente, o nome da classe é igual ao nome da migração, que está Initial
neste exemplo.
A Initial
classe possui dois métodos Up()
e Down()
.
- O
Up()
método usaMigrationBuilder
para criar e gerenciar objetos de banco de dados, como criar tabelas e adicionar/remover colunas com base no modelo. - O
Down()
método inverte oUp()
método. Se oUp()
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 Migrations
diretó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-Database
comando. 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-Migration
comando:
- 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-Database
comando no banco de dados de desenvolvimento enquanto usa Script-Migration
no banco de dados de produção.
Executaremos o Script-Migration
comando 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-Database
Linguagem 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 aDepartment
classe do modelo.Employees
– mapeia para aEmployee
classe do modelo.
O seguinte mostra o conteúdo da __EFMigrationHistory
tabela:
Criando uma nova migração
Suponha que você precise de uma propriedade chamada DateOfBirth
para a Employee
classe e sincronize-a com o banco de dados. Para fazer isso, você segue estas etapas:
Primeiro, defina a DateOfBirth
propriedade na Employee
classe:
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-Migration
comando:
Add-Migration EmployeeDOB
Linguagem 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 Migrations
diretório:
20230608063613_EmployeeDOB.cs
Linguagem 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 à Employees
tabela enquanto o Down()
método elimina a coluna dela.
Terceiro, execute o Update-Database
comando para aplicar a migração ao banco de dados:
Update-Database
Linguagem de código: texto simples ( texto simples )
Ele sincronizará as alterações no banco de dados. Se você visualizar a Employees
tabela, verá a nova DateOfBirth
coluna:
Resumo
- Use o fluxo de migração do EF Core para aplicar alterações de modelos ao banco de dados.
- Use o
Add-Migration
comando para criar uma nova migração. - Use o
Update-Database
comando para aplicar uma migração ao banco de dados. - Use o
Script-Migration
comando para gerar um arquivo de script SQL.