Não é possível gerar uma migração explícita na estrutura da entidade

96

Estou adicionando uma nova migração, mas esta mensagem mostra:

Não é possível gerar uma migração explícita porque as seguintes migrações explícitas estão pendentes: [201203170856167_left]. Aplique as migrações explícitas pendentes antes de tentar gerar uma nova migração explícita.

Alguém pode me ajudar?

Noman Saeed
fonte
11
Isso aconteceu comigo quando eu acidentalmente troquei meu projeto de inicialização para um diferente. Você (ou outras pessoas lendo isto) podem querer verificar isso rapidamente antes de tentar uma solução de problemas mais profunda (especialmente aquelas em que você tem que começar a excluir migrações e outros).
NicholasFolk,
Há uma classe de migração no diretório Migrations que não é atualizada no _MigrationHistory do banco de dados. Remover essa classe para ter o mesmo estado no diretório de migração e no banco de dados resolveu meu problema.
Aryan Firouzian
1
Isso acontece comigo aleatoriamente. Quando isso acontece, mostra que todas as minhas migrações precisam ser aplicadas. Tenho que reiniciar o Visual Studio para fazê-lo funcionar porque já tenho tudo configurado corretamente.
Larry Flewwelling

Respostas:

81

Ele informa que há alguma migração não processada em seu aplicativo e que é necessário executar Update-Databaseantes de adicionar outra migração.

Ladislav Mrnka
fonte
12
O que eu quero recriar uma migração inicial? Isso o impede de fazer isso?
Rebecca
Não funcionou para mim, Update-Database apenas me deu outro erro. Tive que excluir os arquivos pendentes primeiro.
Vahx
1
A resposta de Thomas foi útil para o meu caso semelhante.
Tarek Shawadfy
2
Pode ser necessário declarar um projeto de inicialização-StartupProject ContentHub.Database
osanger
2
Update-Databasedá> Incapaz de atualizar o banco de dados para corresponder ao modelo atual porque há alterações pendentes
ASpirina
53

Eu tive o mesmo problema. Aparentemente, a estrutura de entidade gera este erro quando não consegue se conectar ao banco de dados. Portanto, certifique-se de que você pode acessá-lo antes de procurar outros problemas.

Robin Dorbell
fonte
1
Eu também acrescentaria que esse seria o caso quando você mover seu App.config para outro projeto ou se ele simplesmente estiver ausente em seu projeto ou se estiver em seu projeto, mas estiver configurado incorretamente.
Code Maverick
Recebi este mesmo erro depois que meu IP mudou (aconteceu depois de mudar de local e depois de uma mudança de DNS de dyn). Isso fez com que o firewall no Banco de Dados do Azure que estamos usando revogasse o logon. As migrações EF inúteis fornecem o erro acima em vez de "não foi possível fazer login" ...
Victor
8
Outro ponto que gostaria de destacar é ter certeza de verificar se o seu projeto de inicialização é um com a string de conexão do contexto do banco de dados. Tive esse problema quando mudei temporariamente meu projeto de inicialização e não percebi que o outro projeto não tinha a mesma string de conexão.
Gage Trader de
Adicionando ao @GageTrader: Eu tinha vários projetos de inicialização, um sem configuração e projeto da web com EF-config. o projeto (Repositório) com migrações tem a mesma configuração EF em seu app.config que o projeto web. mas mesmo quando selecionei o projeto de repositório como projeto de inicialização ele não funcionou, mas quando configurei o projeto da web para inicializar funcionou.
JimiSweden,
Tive que declarar explicitamente o parâmetro -ConnectionString, que funcionou para mim
Brian Colavito
34

Você precisa executar "update-database" no console do gerenciador de pacotes para enviar suas alterações para o banco de dados OU você pode excluir o arquivo de migração pendente ([201203170856167_left]) de sua pasta Migrations e, em seguida, executar novamente "add-migration" para crie uma nova migração baseada em suas edições.

socketman
fonte
1
Excluí o arquivo de migração e executei a migração de adição, mas ainda dá o mesmo erro.
nu everest
2
Obrigado, a dica sobre a exclusão do arquivo de migração pendente foi um salva
Manish
31

Este erro também pode significar que as migrações não são mais reconhecidas. Isso aconteceu comigo depois de ter alterado o valor de ContextKey em Migrations.Configuration. A solução foi simplesmente atualizar o ContextKey na tabela do banco de dados "__MigrationHistory" (ou reverter o valor na classe Configuration, eu acho). O ContextKey e o namespace em seu aplicativo devem corresponder.

Thomas
fonte
1
Essa foi a resposta certa para o meu caso. Como usei um dos meus projetos antigos para um novo projeto semelhante, não fui capaz de fazer alterações no banco de dados nas migrações antigas. Como Thomas sugeriu, o namespace era diferente em Migrations from the Contextkey na tabela _MigrationsHistory, que fazia com que migrações antigas não fossem reconhecidas.
Tarek Shawadfy
1
Isso me ajudou porque eu causei o problema ao renomear a solução. No processo, renomeei a ContextKey para que ela não correspondesse mais às entradas _MigrationHistory.
Joel
Também funcionou para mim, definir uma chave de contexto explícita na configuração, alterá-la no __MigrationHistory e update-database decidiu que estava tudo bem. Obrigado!
James White
2
Ridículo, mas está certo. Se você atualizou o nome do projeto, ou se você dividiu seu projeto (meu caso) em alguns e está tentando adicionar uma nova migração de um novo projeto para o mesmo banco de dados, você deve usar o ContextKey correto, você pode defini-lo no construtor de configuração ( você tem que usar a chave de contexto que você tem na tabela __MigrationHistory no banco de dados de destino)
BotanMan
mesmo aqui, renomeei meu espaço de nome padrão e o substituí em toda a minha solução, o que causou esse problema
WtFudgE
18

1. String de conexão / Permissões de conexão

Verifique a string de conexão novamente.

Certifique-se de que o usuário com o qual você está se conectando ainda tenha permissão para ler [__MigrationHistory]e editar o esquema.

Você também pode tentar alterar a string de conexão no arquivo de configuração do aplicativo ou da Web para usar a segurança integrada (Windows Auth) para executar o comando add-migration como você mesmo .

Por exemplo:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

Essa string de conexão iria para o arquivo App.config do projeto onde o DbContext está localizado.

2. Projeto de inicialização

Você pode especificar o projeto de inicialização na linha de comando ou você pode botão direito do mouse o projeto com o DbContext, Configuratione Migrações pasta e selecione Definir como projeto de inicialização . Estou falando sério, isso pode realmente ajudar.

insira a descrição da imagem aqui

Jess
fonte
Haha. Eu gostaria que isso gerasse mais votos. Isso acontece muito comigo e a Integrated Securitycorreção funciona muito bem!
Jess,
1
Eu tive o mesmo problema, nenhum dos comandos de migração funcionou. Acontece que não definir o projeto de inicialização foi o culpado. Definir isso resolveu meu problema.
Vishal
Mudar o projeto de inicialização funcionou para mim! Eu tinha certeza de que não funcionaria, mas tentei mesmo assim, pois todo o resto falhou. Ótima resposta.
Sylvain Rodrigue
"Definir como inicialização" - nunca teria imaginado! Obrigado!!
Jasel
1
Sim, mudei intencionalmente o projeto de inicialização e esqueci de alterá-lo de volta. E o engraçado é que uma migração anterior foi feita com um projeto de inicialização adequado, então tudo funcionou bem. Mas isso é lógico agora - b / c EF pega a string de conexão do projeto, portanto, "não sabe" que as migrações já foram aplicadas ao DB ...
kosist
8

Tive o mesmo problema e foi capaz de resolver com algumas dicas das respostas acima:

  • No console do gerenciador de pacotes verifique o projeto padrão (aponte para o projeto com a configuração de migração
  • Certifique-se de que o startup-proj tenha um web.config com uma conexão válida (ou
  • Certifique-se de que o projeto com migrações tenha um app.config / web.config com uma cadeia de conexões válida
  • Verifique as permissões no banco de dados (para o usuário configurado em sua conexão)

Use "update-database -verbose" no console do gerenciador de pacotes para obter informações mais específicas onde as migrações tentam se conectar. (Ajudou no meu caso a descobrir que meu projeto de inicialização não estava configurado corretamente ...)

flex
fonte
2
executei "update-database -verbose" e notei que minha string de conexão estava quebrada, lol. Portanto, o comando add-migration dá a mensagem errada.
Wachburn
4
"Garanta que o projeto de inicialização {...}" resolveu meu problema. Obrigado @flex
Andy Schmitt
7

Ao se deparar com esse problema, tente adicionar parâmetros ao cmdlet add-migration. Por exemplo, especificar o projeto de inicialização e também o nome da string de conexão pode ajudar o EF a encontrar seu banco de dados de destino.

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

Onde:

Delta_Defect_0973 é o nome de sua migração

your.namespace.ContextClassName é o nome da sua classe de configuração na pasta de migração, prefixado com o espaço de nome completo.

DeltaProject é o nome do seu projeto principal com o arquivo web.config ou app.config.

DeltaSQL é o nome da string de conexão definida no arquivo web.config ou app.config.

Yves Rochon
fonte
Obrigado. Isso realmente me ajudou.
Jess
Além disso, se você estiver usando injeção de dependência em sua solução, pode ser necessário selecionar um projeto padrão diferente no console do gerenciador de pacotes. Se a EF não conseguir localizar suas migrações, tente selecionar o projeto que realmente contém as migrações como o projeto padrão.
Yves Rochon
5

Esse erro significa que há migrações pendentes que precisam ser confirmadas antes de executar outra migração explícita. Você pode escolher

  1. Execute essas migrações pendentes usando o comando Update-Database
  2. Exclua essas migrações pendentes. A maneira mais segura é abrir a pasta Migrações, clique com o botão direito em [201203170856167_left]> Excluir do projeto

Depois disso, você pode iniciar "Adicionar-Migração ..." novamente

Espero que ajude

Hung Vu
fonte
4

Apenas meus dois centavos:

Meu cenário:

  1. Eu restaurei meu banco de dados local para um estado de funcionamento.
  2. Já teve migrações já aplicadas a ele.
  3. Sempre que eu tentava adicionar uma nova migração, recebia o erro sobre migrações pendentes conforme mencionado no OP.

Solução:

Para contornar isso, apenas forneci parâmetros mais explícitos:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

Acredito que você pode definir uma configuração na pasta app.config para permitir que esse comportamento seja padronizado, de forma que não seja necessário fornecer parâmetros explícitos sempre. No entanto, não tenho certeza de como fazer isso.

IbrarMumtaz
fonte
1
Isso funcionou para mim, eu apenas adicionei o nome da migração ao final do comando mostrado acima.
sfors diz restabelecer Monica em
1
=) - fico feliz em poder ajudar.
IbrarMumtaz
1
-ConnectionStringNameé uma alternativa a isso, e puxará a string de conexão de sua configuração por nome
Simon_Weaver
1
Isso me ajudou porque não estou armazenando a string de conexão no arquivo de configuração
Sasinosoft
3

Existe uma ambigüidade e, portanto, um erro. A melhor maneira é excluir o arquivo de migração atual e criar um novo arquivo de migração ( adicionar migração ) e, em seguida, copiar o conteúdo da nova migração para o arquivo excluído e incluí-lo novamente e executar o comando update-database .

Sachin Cholkar
fonte
Acabei de executar o update-databasecomando, tentei novamente add-migratione funcionou
Smitty-Werben-Jager-Manjenson
3

eu resolvi o mesmo problema assim:

  • deletar arquivo de migração antigo
  • update-database -force
  • Add-Migration AddedEntity
  • atualizar o banco de dados
Yilmazdincsoy
fonte
1

Tive os mesmos problemas e só consegui resolvê-los executando Add-Migration 'MigrationName' -Force

Com -Force sendo a parte importante.

Evan Barke
fonte
1

Meu banco de dados local não tinha o __MigrationHistorypopulado ou existente. Eu criei manualmente a tabela e, em seguida, migrei os dados dessa tabela do PROD para meu banco de dados local. Isso fez com que o VS pensasse que as migrações haviam sido aplicadas (o que aconteceu).

contactmatt
fonte
Eu tive o mesmo problema, fundi meu banco de dados ao vivo na produção, mas, portanto, o histórico de migração foi perdido.
sábado,
1

Dica: é sempre bom usar a -Scriptopção para comandos de migração se você não tiver certeza. Também ajuda muito a entender o queUpdate-Database realmente faz.

Eu executo o seguinte para atualizar o banco de dados e, em seguida, obtenho um script que posso aplicar manualmente (ou apenas executá-lo novamente sem a tag -Script).

Pois Update-Databaseeu executaria o seguinte:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

Onde SQL_AzureLiveestá a string de conexão nomeada em minha configuração.

Então posso verificar se o SQL está certo, aplicá-lo e pronto. Como muitos outros disseram, se a string de conexão estiver errada ou inválida, você receberá este erro.

Simon_Weaver
fonte
1

Para mim, excluí o arquivo de migração (no seu caso, "201203170856167_left") da Migrationspasta e, em seguida, executei o comando abaixo no console do gerenciador de pacotes

Add-Migration <Parameter>
Update-Database
Surendra Mourya
fonte
0

Cenário

  • Estou trabalhando em uma filial na qual criei uma nova migração de banco de dados.
  • Estou pronto para atualizar do master, mas o master também tem uma migração de banco de dados recente.
  • Excluo a migração de banco de dados do meu branch para evitar conflitos.
  • Eu "atualizo do mestre".

Problema

Depois de atualizar a partir do mestre, executo "Add-Migration my_migration_name", mas recebo o seguinte erro:

Não é possível gerar uma migração explícita porque as seguintes migrações explícitas estão pendentes: [201607181944091_AddExternalEmailActivity]. Aplique as migrações explícitas pendentes antes de tentar gerar uma nova migração explícita.

Então, eu executo "Update-Database" e recebo o seguinte erro:

Não foi possível atualizar o banco de dados para corresponder ao modelo atual porque existem alterações pendentes e a migração automática está desativada

Solução

Neste ponto, executar novamente "Add-Migration my_migration_name" resolveu meu problema. Minha teoria é que executar "Update-Database" conseguiu tudo no estado necessário para que "Add-Migration" funcionasse.

Tod Birdsall
fonte
0

Eu também me deparei com esse problema. Ele veio quando criei um novo banco de dados e tinha alterações pendentes para minha migração de banco de dados com código inicial, então tentei executar o comando "Atualizar banco de dados". Solução: Execute o comando "Add-Migration -MigrationName" para criar uma nova migração para o novo banco de dados. Em seguida, execute o comando "Update-Database".

Pritam
fonte
0

Eu tive esse problema também para um banco de dados que eu sabia que estava atualizado ao executar o Add-Migration. Resolvido simplesmente executando o comando Add-Migration uma segunda vez. Suspeite de um problema de conectividade, conforme sugerido por Robin Dorbell acima.

spadelives
fonte
Em meu cenário, o nome do banco de dados fazia distinção entre maiúsculas e minúsculas ao executar o comando. assim que fez a conexão exatamente igual ao que estava no banco de dados, funcionou bem
PBo
0

Isso aconteceu quando de repente renomeei a classe de migração antiga que já existe no banco de dados. Eu verifiquei o histórico do VCS, determinei isso e renomeei. Tudo funcionou depois.

Doutor Coder
fonte
0

Eu fiz de outra maneira. Eu eliminei o banco de dados completamente e executei "update-database" novamente no vs.

Ghadir Farzaneh
fonte
Isso não fornece uma solução viável; a migração válida mantém a estrutura existente.
Ferdipux
0

Eu tive um problema mais simples. O VS relatou erroneamente esse erro quando eu tinha uma conexão VPN com o site de um cliente conectado na minha estação de trabalho. O problema era que a segurança do DBMS estava configurada para aceitar solicitações apenas do meu IP local real. Simplesmente desligar a VPN resolveu o problema.

spadelives
fonte
0

No meu caso, esqueci de adicionar meu endereço IP nas regras de firewall no Azure, basicamente porque não conseguia me conectar ao banco de dados, recebi esse erro. Então, especificamente para o meu caso, adicionei meu endereço IP nas regras de firewall do banco de dados no Azure e tudo funcionou bem. Além disso, pode ser o problema de proxy / conexão com a Internet / senha do nome de usuário do banco de dados / string de conexão do banco de dados, etc. OU, obviamente, você pode ter migrações pendentes para as quais você precisa executar o comando Update-Database.

Siddharth Sachdeva
fonte
0

Historicamente, sempre resolvi isso excluindo as migrações pendentes ou, se houvesse apenas 1 restante e fosse mais desejável, usando -fpara recriá-lo.

Recentemente, isso parou de funcionar para mim.

Quando isso aconteceu pela primeira vez, reiniciei o Visual Studio e ele me permitiu continuar.

Na segunda vez, só funcionou depois que executei um Clean no projeto. Era quase como se as migrações pendentes fossem retidas, apesar de excluir todos os arquivos do explorer.

Adam Marshall
fonte
0

Essa não será a resposta para muitas pessoas, mas EF irá eliminar esse erro quando não puder se conectar ao banco de dados. Se você está trabalhando em casa como eu, certifique-se de que ainda está conectado à VPN!

CodingCretin
fonte
-1

Sofri exatamente o mesmo problema logo após a reversão de uma migração para outra.

No meu caso, eu "direcionei a migração" de "migration06" para "migration04".

Eu precisei deletar o "migration0" 6 e então fui capaz de forçar a criação do "migration05". Isso basicamente significa que você precisa apenas manter a próxima migração após a migração de destino.

Gonzo345
fonte
-1

No meu caso (usando o MS Visual Studio), foi tão simples quanto reiniciar o Visual Studio.

AGuyCalledGerald
fonte