Impossibile generare una migrazione esplicita nel framework dell'entità


96

Sto aggiungendo una nuova migrazione ma questo messaggio mostra:

Impossibile generare una migrazione esplicita perché le seguenti migrazioni esplicite sono in sospeso: [201203170856167_left]. Applicare le migrazioni esplicite in sospeso prima di tentare di generare una nuova migrazione esplicita.

Qualcuno può aiutarmi?


11
Questo è successo a me quando avevo accidentalmente cambiato il mio progetto di avvio con uno diverso. Tu (o altri che stanno leggendo questo) potresti volerlo controllare rapidamente prima di provare a risolvere i problemi più in profondità (specialmente quelli in cui devi iniziare a eliminare le migrazioni e simili).
NicholasFolk

Esiste una classe di migrazione nella directory Migrations che non viene aggiornata nella _MigrationHistory del database. La rimozione di quella classe per avere lo stesso stato sia nella directory di migrazione che nel database ha risolto il mio problema.
Aryan Firouzian

1
Questo mi succede in modo casuale. Quando accade mostra che tutte le mie migrazioni devono essere applicate. Devo riavviare Visual Studio per farlo funzionare perché ho già tutto impostato correttamente.
Larry Flewwelling il

Risposte:


81

Ti dice che c'è una migrazione non elaborata nella tua applicazione e che deve essere eseguita Update-Databaseprima di poter aggiungere un'altra migrazione.


12
Quello che vuoi ricreare una migrazione iniziale? Questo ti impedisce di farlo?
Rebecca

Non ha funzionato per me, Update-Database mi ha appena dato un altro errore. Ho dovuto eliminare prima i file in sospeso.
Vahx

1
La risposta di Thomas è stata quella utile per il mio caso simile.
Tarek Shawadfy

2
Potrebbe essere necessario dichiarare un progetto di avvio-StartupProject ContentHub.Database
osanger

2
Update-Databasedà> Impossibile aggiornare il database in modo che corrisponda al modello corrente perché ci sono modifiche in sospeso
ASpirina

53

Ho avuto lo stesso problema. Apparentemente Entity Framework genera questo errore quando non è in grado di connettersi al database. Quindi assicurati di essere in grado di accedervi prima di cercare altri problemi.


1
Vorrei anche aggiungere che questo sarebbe il caso quando sposti il ​​tuo App.config su un altro progetto o se è semplicemente mancante nel tuo progetto o se è nel tuo progetto ma è configurato in modo errato.
Code Maverick

Ho ricevuto lo stesso errore dopo che il mio IP è cambiato (è accaduto sia dopo aver cambiato posizione che dopo un cambio di dns). Ciò ha causato il firewall nel database di Azure che stiamo utilizzando per revocare l'accesso. Inutili migrazioni EF danno l'errore sopra invece di "impossibile accedere" ...
Victor

8
Un altro punto che vorrei sottolineare è assicurarmi di controllare che il tuo progetto di avvio sia uno con la stringa di connessione del tuo contesto db. Ho avuto questo problema quando ho modificato temporaneamente il mio progetto di avvio e non mi rendevo conto che l'altro progetto non aveva la stessa stringa di connessione.
Gage Trader

Aggiunta a @GageTrader: avevo più progetti di avvio, uno senza configurazione e un progetto web con EF-config. il progetto (Repository) con le migrazioni ha la stessa configurazione EF nel suo app.config del progetto web. ma anche quando ho selezionato il progetto di repository come progetto di avvio non ha funzionato, ma quando ho impostato il progetto web per l'avvio ha funzionato.
Jimi Svezia,

Ho dovuto dichiarare esplicitamente il parametro -ConnectionString, che ha funzionato per me
Brian Colavito

34

È necessario eseguire "update-database" dalla console del gestore pacchetti per inviare le modifiche al database OPPURE eliminare il file di migrazione in sospeso ([201203170856167_left]) dalla cartella Migrations e quindi rieseguire "add-migration" a crea una nuova migrazione basata sulle tue modifiche.


1
Ho eliminato il file di migrazione ed eseguito l'aggiunta della migrazione, ma restituisce ancora lo stesso errore.
nu everest

2
Grazie, il suggerimento sull'eliminazione del file di migrazione in sospeso è stato un vero toccasana
Manish

31

Questo errore può anche significare che le migrazioni non vengono più riconosciute. Questo mi è successo dopo aver cambiato il valore di ContextKey in Migrations.Configuration. La soluzione era semplicemente aggiornare il ContextKey nella tabella del database "__MigrationHistory" (o ripristinare il valore nella classe Configuration immagino). La ContextKey e lo spazio dei nomi nella tua applicazione dovrebbero corrispondere.


1
Quella era la risposta giusta per il mio caso. Poiché ho utilizzato uno dei miei vecchi progetti per un nuovo progetto simile, non sono stato in grado di apportare modifiche al DB sulle vecchie migrazioni. Come suggerito da Thomas, lo spazio dei nomi era diverso nelle Migrations from the Contextkey nella tabella _MigrationsHistory, il che causava il mancato riconoscimento delle vecchie migrazioni.
Tarek Shawadfy

1
Questo mi ha aiutato perché ho causato il problema rinominando la soluzione. Nel processo avevo rinominato ContextKey in modo che non corrispondesse più alle voci _MigrationHistory.
Joel

Ha funzionato anche per me, ho impostato una chiave di contesto esplicita nella configurazione, l'ho modificata in __MigrationHistory e update-database ha deciso che tutto andava bene. Grazie!
James White,

2
Ridicolo, ma è giusto. Se hai aggiornato il nome del progetto, o se dividi il tuo progetto (il mio caso) in pochi e stai cercando di aggiungere una nuova migrazione da un nuovo progetto allo stesso db, devi usare ContextKey corretto, puoi impostarlo nel costruttore di configurazione ( devi usare la chiave di contesto che hai nella tabella __MigrationHistory nel DB di destinazione)
BotanMan

lo stesso qui, ho rinominato il mio spazio dei nomi predefinito e l'ho sostituito in tutta la mia soluzione che ha causato questo problema
WtFudgE

18

1. Stringa di connessione / Autorizzazioni di connessione

Verificare nuovamente la stringa di connessione.

Assicurati che l'utente con cui ti stai connettendo abbia ancora l' autorizzazione per la lettura [__MigrationHistory]e l'autorizzazione per modificare lo schema.

Puoi anche provare a modificare la stringa di connessione nell'app o nel file di configurazione Web per utilizzare la sicurezza integrata (autenticazione di Windows) per eseguire il comando add-migration come te stesso .

Per esempio:

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

Questa stringa di connessione andrebbe nel file App.config del progetto in cui si trova il DbContext.

2. Progetto StartUp

È possibile specificare il progetto di avvio sulla riga di comando oppure fare clic con il pulsante destro del mouse sul progetto con la cartella DbContext, Configuratione migrazioni e selezionare Imposta come progetto di avvio . Dico sul serio, questo può effettivamente aiutare.

inserisci qui la descrizione dell'immagine


Haha. Spero che questo ottenga più voti positivi. Questo mi succede spesso e la Integrated Securitycorrezione funziona alla grande!
Jess

1
Ho avuto lo stesso problema, nessuno dei comandi di migrazione ha funzionato. Si scopre che il colpevole non era l'impostazione del progetto di avvio. L'impostazione che ha risolto il mio problema.
Vishal

Cambiare il progetto di avvio ha funzionato per me! Ero sicuro che non avrebbe funzionato ma l'ho provato lo stesso visto che tutto il resto è fallito. Bella risposta.
Sylvain Rodrigue

"Imposta come avvio" - non l' avrebbe mai immaginato! Grazie!!
Jasel

1
Sì, ho intenzionalmente cambiato il progetto di avvio e ho dimenticato di cambiarlo di nuovo. E divertente è che una migrazione prima è stata eseguita con un progetto di avvio appropriato, quindi tutto ha funzionato bene. Ma questo è logico ora - b / c EF prende la stringa di connessione dal progetto, quindi "non sa" che le migrazioni in realtà sono già applicate a DB ...
kosist

8

Ha avuto lo stesso problema ed è stato in grado di risolverlo con alcuni suggerimenti dalle risposte precedenti:

  • Nella console del gestore pacchetti controlla il progetto predefinito (punta al progetto con la configurazione della migrazione
  • Assicurati che startup-proj abbia un web.config con una connectiontring valida (o
  • Assicurati che il progetto con migrazioni abbia un'app.config / web.config con una connectiontring valida
  • Controlla i permessi nel DB (per l'utente configurato nella tua connectiontring)

Utilizza "update-database -verbose" nella console del gestore pacchetti per ottenere informazioni più specifiche a cui le migrazioni tentano di connettersi. (Aiutato nel mio caso a scoprire che il mio progetto di avvio non era impostato correttamente ...)


2
ho eseguito "update-database -verbose" e ho notato che la mia stringa di connessione era rotta, lol. Quindi il comando add-migration dà il messaggio sbagliato.
Wachburn,

4
"Assicurati che startup-proj {...}" abbia risolto il mio problema. Grazie @flex
Andy Schmitt


7

Quando si verifica questo problema, provare ad aggiungere parametri al cmdlet di migrazione dei componenti aggiuntivi. Ad esempio, la specifica del progetto di avvio e del nome della stringa di connessione potrebbe aiutare EF a trovare il database di destinazione.

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

Dove:

Delta_Defect_0973 è il nome della tua migrazione

your.namespace.ContextClassName è il nome della classe di configurazione nella cartella di migrazione, preceduto dallo spazio dei nomi completo.

DeltaProject è il nome del tuo progetto principale con il tuo file web.config o app.config.

DeltaSQL è il nome della stringa di connessione definita nel file web.config o app.config.


Grazie. Questo mi ha davvero aiutato.
Jess

Inoltre, se stai usando l'inserimento delle dipendenze nella tua soluzione, potresti dover selezionare un progetto predefinito diverso nella console di Gestione pacchetti. Se EF non è in grado di individuare le migrazioni, prova a selezionare il progetto che contiene effettivamente le migrazioni come progetto predefinito.
Yves Rochon

5

Questo errore indica che è necessario eseguire il commit delle migrazioni in sospeso prima di poter eseguire un'altra migrazione esplicita. Puoi scegliere di farlo

  1. Esegui le migrazioni in sospeso utilizzando il comando Update-Database
  2. Elimina le migrazioni in sospeso. Il modo più sicuro è aprire la cartella Migrations, fare clic con il tasto destro su [201203170856167_left]> Escludi dal progetto

Dopo questo puoi avviare di nuovo "Add-Migration ..."

Spero che sia d'aiuto


4

Solo i miei due centesimi:

Il mio scenario:

  1. Ho ripristinato il mio database locale in uno stato funzionante.
  2. Le migrazioni erano già state applicate.
  3. Ogni volta che ho provato ad aggiungere una nuova migrazione ho ricevuto l'errore sulle migrazioni in sospeso come menzionato nel mio OP.

Soluzione:

Per aggirare questo problema ho fornito solo parametri più espliciti:

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

Sono indotto a credere che sia possibile impostare un'impostazione nella cartella app.config per consentire di impostare questo comportamento di default in modo da non dover fornire ogni volta parametri espliciti. Tuttavia non sono sicuro di come farlo.


1
Questo ha funzionato per me, ho appena aggiunto il nome della migrazione alla fine del comando mostrato sopra.
sfors dice reintegrare Monica il

1
=) - contento di aver potuto aiutare.
IbrarMumtaz

1
-ConnectionStringNameè un'alternativa a questo e
estrarrà

1
Questo mi ha aiutato perché non sto memorizzando la stringa di connessione nel file di configurazione
Sasinosoft

3

C'è un'ambiguità e quindi un errore. Il modo migliore è escludere il file di migrazione corrente e creare un nuovo file di migrazione ( add-migration ), quindi copiare il contenuto della nuova migrazione nel file escluso e includerlo di nuovo ed eseguire il comando update-database .


Ho appena eseguito il update-databasecomando, poi ho riprovato il mio add-migrationcomando e ha funzionato
Smitty-Werben-Jager-Manjenson

3

ho risolto lo stesso problema in questo modo:

  • eliminare il vecchio file di migrazione
  • update-database -force
  • Add-Migration AddedEntity
  • aggiornare il database

1

Ho avuto gli stessi problemi e sono stato in grado di risolverlo solo eseguendo Add-Migration 'MigrationName' -Force

Con -Force è la parte importante.


1

Il mio database locale non aveva il file __MigrationHistorypopolato o esistente. Ho creato manualmente la tabella e quindi ho migrato i dati in quella tabella da PROD al mio database locale. Ciò ha indotto VS a pensare che le migrazioni fossero state applicate (come erano state).


ho avuto lo stesso problema, ho unito il mio DB live in produzione ma quindi la cronologia della migrazione è andata persa.
matthy

1

Suggerimento: è sempre utile utilizzare l' -Scriptopzione per i comandi di migrazione se non sei sicuro. Aiuta anche davvero a capire cosaUpdate-Database fa effettivamente.

Eseguo quanto segue per aggiornare il database, quindi ottengo uno script che posso applicare manualmente (o semplicemente eseguirlo di nuovo senza il tag -Script).

Perché Update-Databasevorrei eseguire quanto segue:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

Dov'è SQL_AzureLivela stringa di connessione denominata nella mia configurazione.

Quindi posso verificare che l'SQL sia corretto, applicarlo ed essere fatto. Come molti altri hanno detto, se la stringa di connessione è sbagliata o non valida riceverai questo errore.


1

Per me, ho eliminato il file di migrazione (nel tuo caso "201203170856167_left") dalla Migrationscartella, quindi ho eseguito il comando seguente nella console di Gestione pacchetti

Add-Migration <Parameter>
Update-Database

0

Scenario

  • Sto lavorando in un ramo in cui ho creato una nuova migrazione DB.
  • Sono pronto per l'aggiornamento dal master, ma anche il master ha una recente migrazione del database.
  • Elimino la migrazione del database del mio ramo per evitare conflitti.
  • "Aggiorno da master".

Problema

Dopo l'aggiornamento dal master, eseguo "Add-Migration my_migration_name", ma ricevo il seguente errore:

Impossibile generare una migrazione esplicita perché le seguenti migrazioni esplicite sono in sospeso: [201607181944091_AddExternalEmailActivity]. Applicare le migrazioni esplicite in sospeso prima di tentare di generare una nuova migrazione esplicita.

Quindi, eseguo "Update-Database" e ottengo il seguente errore:

Impossibile aggiornare il database in modo che corrisponda al modello corrente perché sono presenti modifiche in sospeso e la migrazione automatica è disabilitata

Soluzione

A questo punto, rieseguire "Add-Migration my_migration_name" ha risolto il problema. La mia teoria è che l'esecuzione di "Update-Database" ha ottenuto tutto nello stato necessario per far funzionare "Add-Migration".


0

Mi sono imbattuto anche in questo problema. È arrivato quando ho creato un nuovo DB e avevo modifiche in sospeso per la mia migrazione del DB code-first, quindi ho provato a eseguire il comando "Update-Database". Soluzione: eseguire il comando "Add-Migration -MigrationName" per creare una nuova migrazione per il nuovo DB. Quindi eseguire il comando "Aggiorna database".


0

Ho avuto questo problema anche per un database che sapevo fosse aggiornato durante l'esecuzione di Add-Migration. Risolto semplicemente eseguendo il comando Add-Migration una seconda volta. Sospetta un problema di connettività, come suggerito da Robin Dorbell sopra.


Nel mio scenario il nome del database era sensibile al maiuscolo / minuscolo durante l'esecuzione del comando. non appena ha reso la
stringa di

0

Ciò è accaduto quando ho improvvisamente rinominato la classe della vecchia migrazione che già esiste in db. Ho controllato la cronologia di VCS, l'ho determinata e l'ho rinominata. Dopo tutto ha funzionato.


0

Ho fatto un altro modo. Ho abbandonato completamente il database ed ho eseguito di nuovo "update-database" in vs.


Ciò non fornisce una soluzione praticabile; la migrazione valida mantiene la struttura esistente.
Ferdipux

0

Ho avuto un problema più semplice. VS ha segnalato erroneamente questo errore quando avevo una connessione VPN al sito di un cliente connesso alla mia workstation. Il problema era che la sicurezza DBMS era impostata per accettare richieste solo dal mio IP locale reale. La semplice disattivazione della VPN ha risolto il problema.


0

Nel mio caso, ho dimenticato di aggiungere il mio indirizzo IP nelle regole del firewall in Azure, fondamentalmente poiché non ero in grado di connettermi al database, stavo ricevendo questo errore. Quindi, specificamente per il mio caso, ho aggiunto il mio indirizzo IP nelle regole del firewall del database in Azure e tutto ha funzionato bene. Oltre a questo, potrebbe essere il problema di proxy / connessione Internet / password nome utente DB / stringa di connessione DB ecc. O ovviamente, potresti avere migrazioni in sospeso per le quali devi eseguire il comando Update-Database.


0

Storicamente ho sempre risolto questo problema eliminando le migrazioni in sospeso, o se ne rimaneva solo 1 ed era per lo più desiderabile, utilizzando -f per ricrearlo.

Di recente, questo ha smesso di funzionare per me.

Quando ciò è accaduto per la prima volta, ho riavviato Visual Studio, quindi è stato possibile procedere.

La seconda volta, ha funzionato solo dopo aver eseguito un Clean sul progetto. Era quasi come se le migrazioni in sospeso fossero state mantenute nonostante l'eliminazione di tutti i file da Explorer.


0

Questa non sarà la risposta per molte persone, ma EF bloccherà questo errore quando non potrà connettersi al DB. Se lavori da casa come me, assicurati di essere ancora connesso alla tua VPN!


-1

Ho subito lo stesso problema subito dopo essere tornato da una migrazione a un'altra.

Nel mio caso ho "mirato la migrazione" da "migration06" a "migration04".

Avevo bisogno di eliminare il "migration0" 6 e poi sono stato in grado di forzare la creazione del "migration05". Ciò significa fondamentalmente che è necessario mantenere la migrazione successiva dopo quella mirata.


-1

Nel mio caso (utilizzando MS Visual Studio), è stato semplice come riavviare Visual Studio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.