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.


3
tente adicionar -forceno final
— prospector


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


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

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.


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

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).


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

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!


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

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

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


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.


1

primeiro, execute o seguinte comando:

PM>update-database -migration:0

e execute este:

PM>remove_migration

Terminar


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

await context.Database.EnsureDeletedAsync();

-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.


Isso levará a um estado inconsistente do banco de dados (por exemplo, uma coluna já foi descartada)
— UNeverNo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.