Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Neste tutorial, você começará 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 para cima e para baixo
- Saiba mais sobre o instantâneo do modelo de dados
- Aplique a migração
Prerequisites
About migrations
Quando você desenvolve um novo aplicativo, o modelo de dados é alterado com frequência e sempre 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 se ele não existir. Em seguida, sempre 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 propaga-o com dados de teste.
Esse método de manter o banco de dados em sincronia com o modelo de dados funciona bem até que você implante o aplicativo em produção. Quando o aplicativo está em execução em produção, geralmente está armazenando dados que você deseja manter e você não quer perder tudo sempre que fizer uma alteração, como adicionar uma nova coluna. O EF Core recurso Migrações resolve esse problema permitindo que o EF atualize o esquema de banco de dados em vez de criar um novo banco de dados.
Para trabalhar com migrações, você pode usar o PMC ( Console do Gerenciador de Pacotes ) ou a CLI. Estes tutoriais mostram como usar comandos da CLI. As informações sobre o PMC estão no final deste tutorial.
Remover o banco de dados
Instale EF Core as ferramentas como uma ferramenta global e exclua o banco de dados:
dotnet tool install --global dotnet-ef
dotnet ef database drop
Note
Por padrão, a arquitetura dos binários do .NET a serem instalados representa a arquitetura do SO sendo executado no momento. Para especificar uma arquitetura de SO diferente, consulte instalação da ferramenta dotnet, opção --arch. Para obter mais informações, confira o problema dotnet/AspNetCore.Docs #29262 do GitHub.
A seção a seguir explica como executar comandos da CLI.
Criar uma migração inicial
Salve suas alterações e compile 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.
Insira "cmd" na barra de endereços e pressione Enter.
Insira 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 você vir uma mensagem de erro "não pode acessar o arquivo ... ContosoUniversity.dll porque ele está sendo usado por outro processo.", localize o ícone do IIS Express na Bandeja do Sistema do Windows e clique com o botão direito do mouse nele e clique nele e clique em ContosoUniversity > Stop Site.
Examinar métodos para cima e para baixo
Quando você executou o comando migrations add, o EF gerou o código que criará o banco de dados do zero. Esse código está na pasta Migrações , no arquivo chamado <timestamp>_InitialCreate.cs. O Up método da InitialCreate classe cria as tabelas de banco de dados que correspondem aos conjuntos de entidades do modelo de 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
}
}
As migrações chamam o Up método para implementar as alterações do modelo de dados para uma migração. Quando você insere um comando para reverter a atualização, as Migrações chamam o Down método.
Esse código é para a migração inicial que foi criada quando você inseriu o migrations add InitialCreate comando. O parâmetro de nome de migração ("InitialCreate" no exemplo) é usado para o nome do arquivo e pode ser o que você quiser. É melhor escolher uma palavra ou frase que resume 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 ele não precisa ser executado porque o banco de dados já corresponde ao modelo de dados. Quando você implanta o aplicativo em outro ambiente em que 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 você derrubou o banco de dados anteriormente, 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 em Migrations/SchoolContextModelSnapshot.cs. Quando você adiciona uma migração, o EF determina o que foi alterado 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 instantâneo 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, insira o comando a seguir 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 é omitida no exemplo de saída a seguir. Se você preferir não ver esse nível de detalhes em mensagens de log, poderá alterar o nível de log no appsettings.Development.json arquivo. Para obter mais informações, consulte Logging no .NET e 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 você fez no primeiro tutorial. Você observará 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.
Comparar CLI e PMC
As ferramentas de EF para gerenciar migrações estão disponíveis nos comandos da CLI do .NET ou nos cmdlets do PowerShell na janela do 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 . Esse pacote está incluído no metapacote Microsoft.AspNetCore.App, portanto, você não precisa adicionar uma referência de pacote se o aplicativo tiver uma referência de pacote para Microsoft.AspNetCore.App.
Importante: Esse 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 da CLI que termina em Tools.DotNet.
Para obter mais informações sobre os comandos da CLI, consulte a CLI do .NET.
Para obter mais informações sobre os comandos pmc, consulte Console do Gerenciador de Pacotes (Visual Studio).
Obter o código
Baixe ou exiba o aplicativo concluído.
Next step
Avance para o próximo tutorial para começar a examinar tópicos mais avançados sobre como expandir o modelo de dados. Ao longo do caminho, você criará e aplicará migrações adicionais.