Redefinir migrações de estrutura de entidade

299

Eu reduzi minhas migrações, usei IgnoreChangesna migração inicial, mas agora quero excluir todas as minhas migrações e começar com uma migração inicial com toda a lógica.

Quando eu excluo as migrações na pasta e tento e Add-Migrationele não gera um arquivo completo (está vazio - porque eu não fiz nenhuma alteração desde a minha última, mas agora excluída) migração.

Existe algum comando Desativar Migrações , para que eu possa executar novamente Enable-Migrations?

Todd
fonte
3
Uma observação importante se você tiver várias cadeias de conexão: especifique qual delas usar ao redefinir as migrações; caso contrário, tentará aplicar a ambas, o que pode causar problemas quando houver discrepâncias.
Jeroen Vannevel
Nota: Se você não tivesse excluído suas migrações (você usa o controle de versão certo?), Poderia atualizar seu db -para a primeira migração, excluindo a mitigação e criando novas migrações a partir desse ponto. Veja aqui: stackoverflow.com/a/23793384/309634
DarcyThomas

Respostas:

446

Você precisa :

  1. Excluir o estado: exclua a pasta de migrações no seu projeto; E
  2. Exclua a __MigrationHistorytabela no seu banco de dados (pode estar em tabelas do sistema); Então
  3. Execute o seguinte comando no console do gerenciador de pacotes:

    Enable-Migrations -EnableAutomaticMigrations -Force

    Use com ou sem -EnableAutomaticMigrations

  4. E, finalmente, você pode executar:

    Add-Migration Initial
Todd
fonte
5
^^ Descobri - foi um erro do TFS - se você estiver usando o TFS, precisará fazer um check-in antes de executar o comando "Enable-Migrations ...". : D
BrainSlugs83
7
Se você não estiver usando o controle de versão, salve seus valores de Seed antes de excluir!
RyanJMcGowan
77
@RyanJMcGowan se você não estiver usando o controle de versão, você merece perder seu trabalho. :-)
Mike Cole
4
@Tood. +1 a isso. Economizou muito tempo. Agora, se a equipe da EF pudesse incorporar tudo isso ao comando Reset-Migrations. Talvez EF 6 ...
Gerald Davis
24
Para um banco de dados existente, é necessário comentar o conteúdo da função "Para cima". Caso contrário, você obterá um erro quando você executar "Update-banco de dados", que se queixam de que a tabela já existe
Guy
149

O problema: você reduziu suas migrações e deseja redefini-las sem excluir as tabelas existentes.

O Problema: Você não pode redefinir migrações com tabelas existentes no banco de dados, pois a EF deseja criar as tabelas do zero.

O que fazer:

  1. Exclua as migrações existentes da tabela Migrations_History.

  2. Exclua as migrações existentes da pasta Migrations.

  3. Execute Redefinição de adição e migração. Isso criará uma migração na sua pasta Migração, que inclui a criação de tabelas (mas não será executada para evitar erros.)

  4. Agora você precisa criar a linha inicial na tabela MigrationHistory para que o EF tenha uma captura instantânea do estado atual. A EF fará isso se você aplicar uma migração. No entanto, você não pode aplicar a migração que você acabou de fazer, pois as tabelas já existem no seu banco de dados. Então vá para a migração e comente todo o código dentro do método "Up".

  5. Agora execute o update-database. Ele aplicará a migração (sem alterar o banco de dados) e criará uma linha de captura instantânea em MigrationHistory.

Agora você redefiniu suas migrações e pode continuar com as migrações normais.

Greg Gum
fonte
11
Esta é a única resposta que funcionou para mim. A resposta aceita não parece resolver o problema do que acontece quando você executa o Update-Database ou o aplicativo (dependendo do tipo de inicializador que está usando). Ele tentará executar a migração e tentar fazer alterações que já existem. A menos que eu esteja perdendo alguma coisa.
regularmike
2
Também é a resposta mais flexível. No meu caso, houve algumas mudanças que eu precisava aplicar e outras não. Eu poderia apenas manter as coisas úteis no meu Up ().
tec-goblin
1
@ H.Johnson, eu olhei para isso. Você tem uma pergunta sobre isso?
Greg Gum
2
Uma coisa a ter em atenção: no EF 6.0, a tabela _MigrationsHistory contém migrações para vários DBContexts. Excluí-lo pode causar problemas, você deve excluir apenas as linhas em que ContextKey = seu nome de migração. Também após 2 anterior I tinha a permitir-migrações novamente
David Waterworth
2
Essencialmente a mesma resposta, com um exemplo expandido (com screenshots): weblog.west-wind.com/posts/2016/Jan/13/...
nmit026
30

E se

Update-Database TargetMigration: $InitialDatabase

no Console do Gerenciador de Pacotes? Ele deve redefinir todas as atualizações para seu estado inicial.

Link de referência: Primeiras migrações de código - Migrando para uma versão específica (incluindo downgrade)

Chris Voon
fonte
Acho que minha principal frustração não era mais confiar nas migrações para manter com precisão o estado. E, como resultado, quer começar do zero.
Todd
@ Todd, eu tropecei e nem sempre estava claro se eu deveria excluir os arquivos de migração para começar tudo de novo. Agora, está funcionando o seguinte: 1. reverta para a inicial usando o comando "Update-Database - TargetMigration: $ InitialDatabase". 2. Remova todos os arquivos de migração (nomeados usando aaaamMMddHHmmssx_Name.cs ou .vb) 3. Atualize a atualização usando 'add-Migration -Name some_name'. 4. Emita a atualização para afetar seu banco de dados usando 'update-Database'. Espero que funcione para você.
Chris Voon
No meu caso, o comando sugerido nesta resposta resultou em erros de SQL.
23613 Justin Skiles
o que deveria significar "InitialDatabase"? ele excluirá as tabelas ou colunas já criadas no banco de dados?
Serge
16

Para corrigir isso, você precisa:

  1. Exclua todos os arquivos * .cs na pasta Migrações.

  2. Excluir a tabela _MigrationHistory no banco de dados

  3. Corre Enable-Migrations -EnableAutomaticMigrations -Force

  4. Corre Add-Migration Reset

Em seguida, na public partial class Reset : DbMigrationclasse, você precisa comentar todas as tabelas existentes e atuais:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

Se você perder esse pedaço, tudo falhará e você terá que começar de novo!

  1. Agora corra Update-Database -verbose

Isso deve ser bem-sucedido se você tiver feito o procedimento acima corretamente, e agora poderá continuar normalmente.

Prego enferrujado
fonte
2
Em vez de comentar tudo, você também pode escrever "return"; na primeira linha do método Up ().
precisa saber é o seguinte
6

Considerando que isso ainda aparece quando pesquisamos o EF no .NET Core, postarei minha resposta aqui (já que isso me assombrou muito). Observe que existem algumas sutilezas com a versão do EF 6 .NET (sem comando inicial e você precisará excluir os arquivos "Snapshot")

(Testado no .NET Core 2.1)

Aqui estão os passos:

  1. Exclua a _efmigrationhistorytabela.
  2. Procure por toda a sua solução arquivos que contenham Instantâneo em seus nomes, como ApplicationDbContextSnapshot.cs, e exclua- os.
  3. Reconstrua sua solução
  4. Corre Add-Migration InitialMigration

Observação: você deve excluir TODOS os arquivos de instantâneo . Passei inúmeras horas apenas excluindo o banco de dados ... Isso gerará uma migração vazia se você não fizer isso.

Além disso, na terceira posição, você pode nomear sua migração da maneira que desejar.

Aqui estão alguns recursos adicionais: Migrações principais do asp.net CORE geradas em branco

Redefinir migrações do Entity Framework 7

Jose A
fonte
3

No EntityFramework 6, tente:

Add-Migration Initial

para atualizar o arquivo de migração inicial.

Asaf
fonte
3

No Entity Framework Core.

  1. Remova todos os arquivos da pasta de migrações.
  2. Digite no console

banco de dados ef do dotnet drop -f -v

migrações dotnet ef adicionam Inicial

atualização do banco de dados ef dotnet

Liam Kernighan
fonte
2

Meu problema acabou sendo a remoção manual da pasta Migrações. Fiz isso porque queria fazer backup do conteúdo, então simplesmente arrastei a pasta para fora do projeto. Mais tarde, corrigi o problema colocando-o novamente (depois de fazer uma cópia de backup) e removendo a pasta Migrations clicando com o botão direito do mouse no Solutions Explorer e escolhendo Excluir no menu pop-up.

John Deighan
fonte
1

No EF6

  1. Exclua todos os seus arquivos na pasta 'migrações' ... Mas não a 'criação inicial' ou 'configuração'.
  2. Exclua o banco de dados.
  3. Agora corra Add-Migration Initial.
  4. Agora você pode 'atualizar o banco de dados' e tudo ficará bem.
adudley
fonte
1

Exclua a Migrationspasta Cleane Rebuildo projeto. Isso funcionou para mim. Antes de Limpar e Reconstruir, estava dizendo que a Migração já existe, pois na memória em cache, ela ainda não foi excluída.

Siege21x
fonte
0

Esse método não requer exclusão da __MigrationHistorytabela; portanto, você não precisa colocar as mãos no banco de dados ao implantar.

  1. Exclua as migrações existentes da pasta Migrações.
  2. No Console do Gerenciador de Pacotes, execute Add-Migration ResetMigrations
  3. Limpe o histórico de migração no Up()método:
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}
Olexander Ivanitskyi
fonte
0

No Net Core 3.0:

Não consegui encontrar uma maneira de redefinir as migrações .

Também tive problemas com migrações interrompidas e as respostas fornecidas aqui não funcionaram para mim. Eu tenho uma API da web .Net Core 3.0 e, em algum lugar no mês passado, editei o banco de dados diretamente. Sim, eu fiz uma coisa ruim, ruim.

As estratégias sugeridas aqui resultaram em vários erros no Package Manager Console:

  • Já existe uma migração com esse nome
  • Não foi possível encontrar o instantâneo
  • 'Force' não é um parâmetro reconhecido

É verdade que posso ter perdido uma etapa ou ter apagado os arquivos corretos, mas descobri que há maneiras de limpar isso sem tanta força bruta:

  • Remover migração do PMC para cada migração por nome, na ordem inversa da criação, até e incluindo a migração interrompida
  • Adicionar migração para criar uma nova migração que será o delta entre a última boa migração e o esquema atual

Agora, quando a API da web é iniciada com um banco de dados vazio, ela cria corretamente todas as tabelas e propriedades para corresponder aos modelos de entidade.

HTH!

greenCodeMonkey
fonte
0

ATUALIZAÇÃO 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => Seu contexto.

Diego Venâncio
fonte
-3
Enable-Migrations -EnableAutomaticMigrations -Force
Debendra Dash
fonte