Tutorial: Parte 5, aplicar migrações ao exemplo da Universidade Contoso

Neste tutorial, você começa a usar o EF Core recurso de migrações para gerenciar alterações no modelo de dados. Em tutoriais posteriores, você adicionará mais migrações à medida que alterar o modelo de dados.

Neste tutorial, você:

  • Saiba mais sobre migrações
  • Criar uma migração inicial
  • Examinar métodos Up e Down
  • Saiba mais sobre o instantâneo do modelo de dados
  • Aplicar a migração

Prerequisites

Sobre as migrações

Quando você desenvolve um novo aplicativo, seu modelo de dados muda com freqüência e, cada vez que o modelo é alterado, ele fica fora de sincronia com o banco de dados. Você iniciou esses tutoriais configurando o Entity Framework para criar o banco de dados, caso ele não exista. Em seguida, cada vez que você alterar o modelo de dados -- adicionar, remover ou alterar classes de entidade ou alterar sua classe DbContext -- você pode excluir o banco de dados e o EF cria um novo que corresponde ao modelo e o semeia com dados de teste.

Esse método de manter o banco de dados sincronizado com o modelo de dados funciona bem até que você implante o aplicativo na produção. Quando o aplicativo está sendo executado em produção, geralmente está armazenando dados que você deseja manter, e você não quer perder tudo cada vez que faz uma alteração, como adicionar uma nova coluna. O EF Core recurso Migrações resolve esse problema permitindo que o EF atualize o esquema do banco de dados em vez de criar um novo banco de dados.

Para trabalhar com migrações, você pode usar o Console do Gerenciador de Pacotes (PMC) ou a CLI. Estes tutoriais mostram como usar comandos da CLI. Informações sobre o PMC estão no final deste tutorial.

Eliminar o banco de dados

Instale EF Core ferramentas como uma ferramenta global e exclua o banco de dados:

dotnet tool install --global dotnet-ef
dotnet ef database drop

Note

Por defeito, a arquitetura dos binários .NET a instalar representa a arquitetura do sistema operativo atualmente em execução. Para especificar uma arquitetura diferente, revê como usar o dotnet tool install comando com a opção '--arch'. Para mais informações, consulte GitHub dotnet/aspnetcore.docs issue #29262 - Adicione '-a arm64' em Apple Silicon.

A seção a seguir explica como executar comandos da CLI.

Criar uma migração inicial

Salve suas alterações e crie o projeto. Em seguida, abra uma janela de comando e navegue até a pasta do projeto. Aqui está uma maneira rápida de fazer isso:

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e escolha Abrir Pasta no Explorador de Arquivos no menu de contexto.

    Abrir no item de menu Explorador de Ficheiros

  • Digite "cmd" na barra de endereço e pressione Enter.

    Abrir janela de comando

Digite o seguinte comando na janela de comando:

dotnet ef migrations add InitialCreate

Nos comandos anteriores, uma saída semelhante à seguinte é exibida:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'

Se vir uma mensagem de erro "não é possível aceder ao ficheiro ... ContosoUniversity.dll porque está a ser utilizado por outro processo.", localize o ícone do IIS Express no tabuleiro de sistema do Windows, clique com o botão direito do rato no mesmo e, em seguida, clique em Site de Paragem da Universidade Contoso>.

Examinar métodos Up e Down

Quando tu executaste o comando migrations add, o EF gerou o código que criará o banco de dados desde o início. Esse código está na pasta Migrações , no arquivo chamado <timestamp>_InitialCreate.cs. O Up método da classe cria as tabelas de banco de dados que correspondem aos conjuntos de entidades do modelo de InitialCreate dados e o Down método as exclui, conforme mostrado no exemplo a seguir.

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Course",
            columns: table => new
            {
                CourseID = table.Column<int>(nullable: false),
                Credits = table.Column<int>(nullable: false),
                Title = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Course", x => x.CourseID);
            });

        // Additional code not shown
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Enrollment");
        // Additional code not shown
    }
}

Migrações chama o método Up para implementar as alterações do modelo de dados para uma migração. Quando você insere um comando para reverter a atualização, Migrations chama o método Down.

Este código é para a migração inicial que foi criada quando você inseriu o migrations add InitialCreate comando. O parâmetro migration name ("InitialCreate" no exemplo) é usado para o nome do arquivo e pode ser o que você quiser. É melhor escolher uma palavra ou frase que resuma o que está sendo feito na migração. Por exemplo, você pode nomear uma migração posterior como "AddDepartmentTable".

Se você criou a migração inicial quando o banco de dados já existe, o código de criação do banco de dados é gerado, mas não precisa ser executado porque o banco de dados já corresponde ao modelo de dados. Quando você implanta o aplicativo em outro ambiente onde o banco de dados ainda não existe, esse código será executado para criar seu banco de dados, portanto, é uma boa ideia testá-lo primeiro. É por isso que eliminaste o banco de dados mais cedo -- para que as migrações possam criar um novo do zero.

O instantâneo do modelo de dados

As migrações criam um instantâneo do esquema de banco de dados atual no Migrations/SchoolContextModelSnapshot.cs. Quando você adiciona uma migração, o EF determina o que mudou comparando o modelo de dados com o arquivo de instantâneo.

Use o comando dotnet ef migrations remove para remover uma migração. dotnet ef migrations remove Exclui a migração e garante que o snapshot seja redefinido corretamente. Se dotnet ef migrations remove falhar, use dotnet ef migrations remove -v para obter mais informações sobre a falha.

Consulte EF Core Migrações em ambientes de equipe para obter mais informações sobre como o arquivo de instantâneo é usado.

Aplicar a migração

Na janela de comando, digite o seguinte comando para criar o banco de dados e as tabelas nele.

dotnet ef database update

A saída do comando é semelhante ao migrations add comando, exceto que você vê logs para os comandos SQL que configuram o banco de dados. A maioria dos logs são omitidos na saída de exemplo a seguir. Se preferir não ver esse nível de detalhe nas mensagens de log, você pode alterar o nível de log no appsettings.Development.json arquivo. Para obter mais informações, consulte Logging no .NET e no ASP.NET Core.

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      CREATE DATABASE [ContosoUniversity2];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      IF SERVERPROPERTY('EngineEdition') <> 5
      BEGIN
          ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
      END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [__EFMigrationsHistory] (
          [MigrationId] nvarchar(150) NOT NULL,
          [ProductVersion] nvarchar(32) NOT NULL,
          CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
      );

<logs omitted for brevity>

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
      VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
Done.

Use o Pesquisador de Objetos do SQL Server para inspecionar o banco de dados como fez no primeiro tutorial. Você notará a adição de uma tabela __EFMigrationsHistory que controla quais migrações foram aplicadas ao banco de dados. Exiba os dados nessa tabela e você verá uma linha para a primeira migração. (O último log no exemplo de saída da CLI anterior mostra a instrução INSERT que cria essa linha.)

Execute o aplicativo para verificar se tudo ainda funciona da mesma forma que antes.

Página Índice de Estudantes

Comparar CLI e PMC

As ferramentas do EF para gerenciar migrações estão disponíveis nos comandos da CLI do .NET ou nos cmdlets do PowerShell na janela PMC (Console do Gerenciador de Pacotes ) do Visual Studio. Este tutorial mostra como usar a CLI, mas você pode usar o PMC se preferir.

Os comandos EF para os comandos PMC estão no pacote Microsoft.EntityFrameworkCore.Tools . Este pacote está incluído no metapacote Microsoft.AspNetCore.App, portanto, você não precisa adicionar uma referência de pacote se seu aplicativo tiver uma referência de pacote para Microsoft.AspNetCore.App.

Importante: Este não é o mesmo pacote que você instala para a CLI editando o .csproj arquivo. O nome deste termina em Tools, ao contrário do nome do pacote CLI que termina em Tools.DotNet.

Para obter mais informações sobre os comandos da CLI, consulte .NET CLI.

Para obter mais informações sobre os comandos PMC, consulte Console do Gerenciador de Pacotes (Visual Studio).

Obter o código

Descarregue ou veja a candidatura preenchida.

Próximo passo

Avance para o próximo tutorial para começar a examinar tópicos mais avançados sobre a expansão do modelo de dados. Ao longo do caminho, você criará e aplicará migrações adicionais.