Estou usando o EF 6.0 para o meu projeto em c # com migrações e atualizações manuais. Eu tenho cerca de 5 migrações no banco de dados, mas percebi que a última migração era ruim e não a quero. Sei que posso reverter para uma migração anterior, mas quando adiciono uma nova migração (fixa) e executo o Update-Database, até a má migração é aplicada.
Eu estava tentando reverter para a migração anterior e excluir o arquivo com uma migração incorreta. Porém, quando tento adicionar nova migração, recebo um erro ao atualizar o banco de dados, porque o arquivo de migração está corrompido (mais especificamente, a primeira linha de código renomeia a tabela A para B e é a próxima linha, o EF está tentando atualizar a tabela com nome A - talvez seja algum bug da EF).
Existe alguma consulta que eu possa executar, que diria à EF algo como "Esqueça a última migração como se nunca tivesse existido, era ruim"? Algo como Remover-Migração.
Edit1
Encontrei solução adequada para mim. Alterando o modelo para o bom estado e executandoAdd-Migration TheBadMigration -Force
. Isso redefinirá a última migração não aplicada.
De qualquer forma, isso ainda não responde completamente à pergunta original. Se eu atualizar o banco de dados para a migração incorreta, não encontrei uma boa maneira de reverter e criar nova migração, excluindo a incorreta.
obrigado
fonte
Respostas:
Você tem 2 opções:
Você pode tirar o Down da má migração e colocá-lo em uma nova migração (você também precisará fazer as alterações subseqüentes no modelo). Isso está rolando efetivamente para uma versão melhor.
Eu uso essa opção em coisas que foram para vários ambientes.
A outra opção é realmente executar
Update-Database –TargetMigration: TheLastGoodMigration
o banco de dados implantado e excluir a migração da sua solução. Essa é a alternativa do hulk smash e exige que isso seja executado em qualquer banco de dados implantado com a versão ruim.Nota: para redefinir a migração que você pode usar
Add-Migration [existingname] -Force
. No entanto, isso substituirá a migração existente, portanto, faça isso somente se você tiver removido a migração existente do banco de dados. Isso faz o mesmo que excluir o arquivo de migração existente e executaradd-migration
Eu uso essa opção durante o desenvolvimento.
fonte
Como a pergunta indica, isso se aplica a uma migração em um ambiente de tipo de desenvolvimento que ainda não foi lançado.
Esse problema pode ser resolvido nestas etapas: restaure o banco de dados até a última boa migração, exclua a migração incorreta do projeto do Entity Framework, gere uma nova migração e aplique-a ao banco de dados. Nota: A julgar pelos comentários, esses comandos exatos podem não ser mais aplicáveis se você estiver usando o EF Core.
Etapa 1: Restaurar para uma migração anterior
Se você ainda não aplicou sua migração, pode pular esta parte. Para restaurar o esquema do banco de dados para um problema anterior, o comando Update-Database com a opção -TargetMigration especifique a última boa migração. Se o código da estrutura da sua entidade residir em um projeto diferente na sua solução, talvez você precise usar a opção '-Project' ou alternar o projeto padrão no console do gerenciador de pacotes.
Para obter o nome da última boa migração, use o comando 'Get-Migrations' para recuperar uma lista dos nomes de migração que foram aplicados ao seu banco de dados.
Esta lista mostra as migrações aplicadas mais recentes primeiro. Escolha a migração que ocorre na lista após a que você deseja fazer o downgrade, ou seja, a aplicada antes da que você deseja fazer o downgrade. Agora emita um banco de dados de atualização.
Todas as migrações aplicadas após a especificada serão rebaixadas, começando pela última migração aplicada primeiro.
Etapa 2: excluir sua migração do projeto
Se o
remove-migration
comando não estiver disponível na sua versão do Entity Framework, exclua os arquivos da migração indesejada na pasta 'Migrations' do projeto EF manualmente. Neste ponto, você pode criar uma nova migração e aplicá-la ao banco de dados.Etapa 3: adicione sua nova migração
Etapa 4: aplicar sua migração ao banco de dados
fonte
add-migration "new migration"
,update-database
Para aqueles que usam o EF Core com o ASP.NET Core v1.0.0 , tive um problema semelhante e usei os seguintes comandos para corrigi-lo (a postagem de @ DavidSopko me indicou a direção certa, mas os detalhes são um pouco diferentes para o EF Core) :
Por exemplo, no meu desenvolvimento atual, o comando se tornou
O Remove-Migration removerá a última migração que você aplicou. Se você tiver um cenário mais complexo com várias migrações para remover (eu só tinha 2, a inicial e a ruim), sugiro que você teste as etapas em um projeto fictício.
No momento, não parece haver um comando Get-Migrations no EF Core (v1.0.0), portanto, você deve procurar na pasta de migrações e estar familiarizado com o que fez. No entanto, há um bom comando de ajuda:
Atualizando a dastabase no VS2015 SQL Server Object Explorer, todos os meus dados foram preservados e a migração que eu queria reverter desapareceu :)
Inicialmente, tentei o Remove-Migration por si só e achei o comando de erro confuso:
Já existem sugestões para melhorar essa redação, mas eu gostaria que o erro dissesse algo assim:
A saída do comando de ajuda EF Core é a seguinte:
fonte
Você também pode usar
Isso reverterá e removerá a última migração aplicada
fonte
Primeiro, atualize sua última migração perfeita por meio deste comando:
Exemplo:
E, em seguida, exclua sua migração não utilizada manualmente.
fonte
Update-Database 20180906131107_xxxx_xxxx
(sem hífen) funcionou para mim. Nenhuma versão doTargetMigration
switch funcionou. Esses comandos parecem ser um alvo em movimento (ou seja, alterá-los em todas as versões)?A partir do .NET Core 2.2,
TargetMigration
parece ter desaparecido:Então, isso funciona para mim agora:
Assim como (sem
-Migration
chave):Em uma observação adicional, você não pode mais excluir as pastas de migração de maneira limpa sem colocar o snapshot do modelo fora de sincronia. Portanto, se você aprender isso da maneira mais difícil e terminar com uma migração vazia, onde você sabe que deve haver alterações, poderá executar (não são necessárias opções para a última migração):
Ele limpará a bagunça e o levará de volta onde você precisa, mesmo que a última pasta de migração tenha sido excluída manualmente.
fonte
Para o EF 6, aqui está uma lista, se você estiver realizando muitas tarefas em desenvolvimento. Apenas atualize os vars e continue usando a seta para cima no console do gerenciador de pacotes para enxaguar e repetir.
Por que isso é necessário, você pergunta? Não tenho certeza de quais versões do EF6 isso se aplica, mas se o seu novo destino de migração já tiver sido aplicado, o uso de '-Force' para realocar novamente no Add-Migration não será realçado novamente, mas criar um novo arquivo (isso é bom coisa porque você não gostaria de perder o seu 'Down'). O snippet acima faz o 'Down' primeiro, se necessário, e então -Force funciona corretamente para re-andaime.
fonte