Como cancelar a aplicação de uma migração no ASP.NET Core com o EF Core

180

Quando executo PM> Remove-Migration -context BloggingContextno VS2015 com um projeto ASP.NET Core usando o EF Core, obtenho o seguinte erro:

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

Como posso cancelar a aplicação? Estou usando a versão mais recente do ASP.NET Core 1.0, EF Core e VS2015 Update 3.

nam
fonte
3
tente adicionar -forceno final
prospector
1
O artigo learnentityframeworkcore.com/migrations#reversing-a-migration descreve as etapas. Graças @drewskis para o link
Michael Freidgeim
Obrigado
@MichaelFreidgeim

Respostas:

215

Usar:

CLI

> dotnet ef database update <previous-migration-name>

Console do Gerenciador de Pacotes

PM> Update-Database <previous-migration-name>

Exemplo:

PM> Update-Database MyInitialMigration

Em seguida, tente remover a última migração.

A remoção da migração sem atualização do banco de dados não funciona porque você aplicou alterações no banco de dados.

Se estiver usando o PMC, tente: PM> update-database 0 Isso limpará o banco de dados e permitirá remover o instantâneo de migração da sua solução

adem caglin
fonte
6
Ainda estou recebendo o mesmo erro. Eu usei pela primeira vez dotnet ef database update MyFirstMigration --context BloggingContextque funcionou com sucesso. Então eu corri e dotnet ef migrations remove --context BloggingContextme deu a mesma mensagem de erro que no meu post
nam
14
Você precisará atualizar para a migração antes MyFirstMigration. Se essa for a primeira migração (como o nome indica), você poderá usar dotnet ef database update 0para reverter (não aplicar) todas as migrações do banco de dados. Você deve ser capaz de executar dotnet ef migrations remove.
bvpb
Também vale a pena notar que você só deve usar o nome da migração, excluindo a data-prefix
structed
2
Chamada dotnet ef migrations removedepois disso
Chamika Sandamal
Sua segunda declaração: "Então tente remover a última migração" não está completa nesta resposta, diga exatamente o que você quer dizer. remover o arquivo de migração? executar um comando? ...
S.Serpooshan
125

Para remover completamente todas as migrações e começar tudo de novo, faça o seguinte:

dotnet ef database update 0
dotnet ef migrations remove
Ronald Ramos
fonte
1
Mas você não deseja remover todas as migrações. Por exemplo, você deseja manter a migração padrão que o VS cria para identidade (contas de usuário) na pasta Data \ Migrations.
nam
É bom saber dotnet ef database update 0, mas a execução dotnet ef migrations removeposterior removerá a migração padrão do Identity, o que pode não ser o desejado.
Kimbaudi 01/12/16
Obrigado pela dica dotnet ef database update 0! Eu não tinha visto este mencionados em qualquer lugar ...
Tobias J
3
@nam "Mas você não deseja remover todas as migrações." Mas alguns de nós fazem. Não suponha que eu quero :)
starmandeluxe
3
Isso não funcionou para mim. A primeira linha foi ok e remover todas as migrações, na segunda linha ainda ficoThe migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
Ido Ran
52

Você ainda pode usar o Update-Databasecomando

Update-Database -Migration <migration name> -Context <context name>

No entanto, a julgar pelo nome da sua migração, suponho que seja a primeira migração para que o comando possa não funcionar. Você deve poder excluir a entrada da __MigrationHistorytabela no seu banco de dados e executar o Remove-Migrationcomando novamente. Você também pode excluir o arquivo de migração e apenas começar novamente.

Brad
fonte
Você pode ligar Update-Databasedo Package Management Console ou dotnet ef database updatedo prompt de comando no diretório do projeto.
Kimbaudi 01/12/16
7
Apenas para esclarecer a resposta de Brad aqui - <migration name>deve ser o nome da migração para a qual você deseja voltar (ou seja, provavelmente a migração anterior à que você estragou tudo), não o nome da migração que você deseja desfazer.
Mark Amery
52

Para cancelar a aplicação de uma migração específica :

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

Para cancelar a aplicação de todas as migrações :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

Para remover a última migração:

dotnet ef migrations remove
or
PM> Remove-Migration

Para remover todas as migrações:

basta remover a Migrationspasta.

Para remover as últimas migrações (não todas):

Não há um comando para remover várias migrações e não podemos apenas remover esses poucos migrationse seus *.designer.csarquivos, pois precisamos manter o arquivo de instantâneo no estado consistente. Precisamos remover as migrações uma a uma (veja To remove last migrationacima).

Para cancelar a inscrição e remover a última migração:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force
AlbertK
fonte
Continuo vendo a palavra em unapplytodas essas postagens. Apenas me atingiu que não é um termo técnico, é a palavraun - apply
Helzgate
28

Para reverter a última migração aplicada, você deve (comandos do console do gerenciador de pacotes):

  1. Reverter a migração do banco de dados: PM> Update-Database <prior-migration-name>
  2. Remova o arquivo de migração do projeto (ou será reaplicado novamente na próxima etapa)
  3. Atualizar instantâneo do modelo: PM> Remove-Migration

UPD : A segunda etapa parece não ser necessária nas versões mais recentes do Visual Studio (2017).

Dmitry Polomoshnov
fonte
1
Obrigado! Isso funcionou perfeitamente Fascinado que, de todas as soluções nunca ninguém mencionou a necessidade de etapa 2.
Michael Kargl
Yeh, Ninguém mencionou o passo two.Thank você
AJAS Aju
Não tenho certeza sobre a segunda etapa. No meu caso (mais recente do VS2017), o arquivo de migração será excluído automaticamente após a chamada Remove-Migrationsem problemas. Não sei ao certo o que você disse "será reaplicado novamente no próximo passo"!
S.Serpooshan
@ S.Serpooshan De fato. Excluí-o manualmente, mas quando executei o Remove-Migration, ele reclamou que minha migração anterior havia sido aplicada ao banco de dados. Mas funciona.
MetalMikester
O segundo passo eu acho que é necessário apenas se você chamar dbContext.Database.Migrate()em seus startup.cs
user3413723
23

Simplesmente você pode segmentar uma migração por valor

 Update-Database -Migration:0

Então vá em frente e remova-o

 Remove-Migration
John Nyingi
fonte
1
Isso funcionou para mim, mas eu estou usando EF e .NET núcleo 2.0 com VS2017
James Morrison
2
Cuidado: -Migração: 0 significa voltar ao estado sem migrações. Isso limpará seu banco de dados
Kieren Johnstone
Sim, de acordo com a pergunta. Você pode incrementar o valor dependendo da migração você quiser reverter para
John Nyingi
11

Para "cancelar a aplicação" da migração mais recente (depois?) Depois de já ter sido aplicada ao banco de dados:

  1. Abra o SQL Server Object Explorer (Exibir -> "SQL Server Object Explorer")
  2. Navegue para o banco de dados vinculado ao seu projeto expandindo os pequenos triângulos para o lado.
  3. Expandir "Tabelas"
  4. Localize a tabela denominada "dbo._EFMigrationsHistory".
  5. Clique com o botão direito do mouse e selecione "Visualizar Dados" para ver as entradas da tabela no Visual Studio.
  6. Exclua a linha correspondente à sua migração que você deseja aplicar (diga "sim" ao aviso, se solicitado).
  7. Execute "dotnet ef migrations remove" novamente na janela de comando no diretório que possui o arquivo project.json. Como alternativa, execute o comando "Remove-Migration" no console do gerenciador de pacotes.

Espero que isso ajude e seja aplicável a qualquer migração no projeto ... Testei isso apenas na migração mais recente ...

Feliz codificação!

Raj
fonte
21
Na verdade, isso não aplicará a migração, apenas faça com que a estrutura "pense" que não foi aplicada. Seu banco de dados estará em um estado inconsistente se você fizer isso.
mark.monteiro
Editar manualmente os dados em seu __EFMigrationsHistory é um péssimo conselho. Não faça isso. Essa tabela deve ser usada apenas por baixo das ferramentas de migração. Se você começar a editar manualmente os dados, um único erro poderá criar todo tipo de comportamento inesperado e louco no seu projeto. É uma idéia muito melhor usar uma das outras soluções recomendadas.
quer
Tivemos uma situação em que um membro da equipe júnior se confundiu com a alternância de ramificações e acabamos excluindo a migração manualmente de ambas (embora ainda estivesse na tabela __EFMigrationsHistory, pois já havia sido aplicada), então perdemos o "down". Isso foi o que acabamos fazendo, além de algumas reversões manuais no SSMS. Portanto, não faça isso - a menos que você não tenha outra escolha neste momento. Pelo menos, tudo o que ele fez foi adicionar um único novo campo.
Ella
10

Você deve excluir o registro de migração '20160703192724_MyFirstMigration' da tabela '_EFMigrationsHistory' .

caso contrário, este comando removerá a migração e excluirá a pasta de migrações:

   > remove-migration -force
AminGolmahalle
fonte
7

Em geral, se você estiver usando o Package Manager Console, a maneira correta de remover uma migração específica é referenciando o nome da migração.

Update-Database -Migration {Name of Migration} -Context {context}

Outra maneira de remover a última migração aplicada de acordo com os documentos é usando o comando:

dotnet ef migrations remove

Este comando deve ser executado no prompt de comando do desenvolvedor ( como abrir o prompt de comando ) dentro do diretório da solução.

Por exemplo, se o seu aplicativo estiver dentro do nome "Aplicativo" e estiver na pasta c: \ Projetos. Então seu caminho deve ser:

C:\Projects\Application
Anastasios Selmanis
fonte
1
A questão era o que fazer se o `dotnet ef migrations remove 'retornar um erro" A migração já foi aplicada ao banco de dados "
Michael Freidgeim 30/03/18
2

Para cancelar a aplicação de uma migração no EF Core 1.0, use o comando:

atualização do banco de dados dotnet ef {migration_name}

Use o nome da migração até a qual você deseja preservar suas alterações. A lista de nomes da migração pode ser encontrada usando:

lista de migrações dotnet ef

Rufus Lobo
fonte
2

Para reverter todas as migrações aplicadas ao DB, execute:

update-database 0

Deve ser seguido com a execução Remove-Migrationquantas vezes houver arquivos de migração visíveis no diretório de migração. O comando exclui a migração mais recente e também atualiza o instantâneo.

Dipendu Paul
fonte
1

primeiro, execute o seguinte comando:

PM>update-database -migration:0

e execute este:

PM>remove_migration

Terminar

Abbas Hadavandi
fonte
0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();
Kishor Gujar
fonte
-1

1. encontre a tabela "dbo._EFMigrationsHistory" e exclua o registro de migração que deseja remover. 2. execute "remove-migration" no PM (Console do Gerenciador de Pacotes). Funciona para mim.

Átomo
fonte
Isso levará a um estado inconsistente do banco de dados (por exemplo, uma coluna já foi descartada)
UNeverNo