Come non applicare una migrazione in ASP.NET Core con EF Core


180

Quando corro PM> Remove-Migration -context BloggingContextin VS2015 con un progetto ASP.NET Core usando EF Core ottengo il seguente errore:

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.

Come posso applicarlo? Sto usando l'ultima versione di ASP.NET Core 1.0, EF Core e VS2015 Update 3.


3
prova ad aggiungere -forcealla fine
cercatore


Grazie
@MichaelFreidgeim

Risposte:


215

Uso:

CLI

> dotnet ef database update <previous-migration-name>

Console di gestione pacchetti

PM> Update-Database <previous-migration-name>

Esempio:

PM> Update-Database MyInitialMigration

Quindi prova a rimuovere l'ultima migrazione.

La rimozione della migrazione senza aggiornamento del database non funziona perché sono state applicate modifiche al database.

Se si utilizza PMC, provare: PM> update-database 0 Questo cancellerà il database e consentirà di rimuovere l'istantanea della migrazione sulla soluzione


6
Ricevo ancora lo stesso errore. Ho usato per la prima volta dotnet ef database update MyFirstMigration --context BloggingContextche ha funzionato con successo. Poi ho corso dotnet ef migrations remove --context BloggingContextche mi ha dato lo stesso messaggio di errore del mio post
nam

14
È necessario aggiornare prima alla migrazione MyFirstMigration. Se questa è la prima migrazione (come suggerisce il nome), è possibile utilizzare dotnet ef database update 0per ripristinare (non applicare) tutte le migrazioni dal database. Dovresti quindi essere in grado di eseguire dotnet ef migrations remove.
bvpb,

Vale anche la pena notare che è necessario utilizzare solo il nome della migrazione, escluso il prefisso della data
Struced

2
Chiama dotnet ef migrations removedopo questo
Chamika Sandamal,

La tua seconda affermazione: "Quindi prova a rimuovere l'ultima migrazione" non è completa in questa risposta, ti preghiamo di dire esattamente cosa intendi. rimuovere il file di migrazione? eseguire un comando? ...
S. Serpooshan il

125

Per rimuovere completamente tutte le migrazioni e ricominciare tutto da capo, procedi come segue:

dotnet ef database update 0
dotnet ef migrations remove

1
Ma non vuoi rimuovere tutte le migrazioni. Ad esempio, si desidera mantenere la migrazione predefinita creata da VS per l'identità (Account utente) nella cartella Dati \ Migrazioni.
nam

È utile sapere dotnet ef database update 0, ma l'esecuzione dotnet ef migrations removesuccessiva rimuoverà la migrazione predefinita per Identity, che potrebbe non essere desiderata.
Kimbaudi,

Grazie per il suggerimento dotnet ef database update 0! Non l'avevo mai visto menzionato da nessuna parte ...
Tobias J

3
@nam "Ma non vuoi rimuovere tutte le migrazioni." Ma alcuni di noi lo fanno. Non dare per scontato quello che voglio :)
starmandeluxe il

3
Questo non ha funzionato per me. La prima riga era ok e rimuove tutte le migrazioni, sulla seconda riga ottengo ancoraThe 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

Puoi ancora usare il Update-Databasecomando.

Update-Database -Migration <migration name> -Context <context name>

Tuttavia, a giudicare dal nome della tua migrazione, suppongo sia la prima migrazione, quindi il comando potrebbe non funzionare. Dovresti essere in grado di eliminare la voce dalla __MigrationHistorytabella nel tuo database e quindi eseguire Remove-Migrationnuovamente il comando. È inoltre possibile eliminare il file di migrazione e ricominciare da capo.


È possibile chiamare Update-Databasedalla console di gestione dei pacchetti o chiamare dotnet ef database updatedal prompt dei comandi dalla directory del progetto.
Kimbaudi,

7
Giusto per chiarire la risposta di Brad qui - <migration name>dovrebbe essere il nome della migrazione a cui vuoi tornare (cioè probabilmente la migrazione prima di quella che hai rovinato), non il nome della migrazione che vuoi annullare.
Mark Amery,

52

Per annullare l'applicazione di una o più migrazioni specifiche :

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

Per annullare l'applicazione di tutte le migrazioni :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

Per rimuovere l'ultima migrazione:

dotnet ef migrations remove
or
PM> Remove-Migration

Per rimuovere tutte le migrazioni:

basta rimuovere la Migrationscartella.

Per rimuovere le ultime migrazioni (non tutte):

Non esiste un comando per rimuovere un gruppo di migrazioni e non possiamo semplicemente rimuovere questi pochi migrationse i loro *.designer.csfile poiché dobbiamo mantenere il file di snapshot nello stato coerente. Dobbiamo rimuovere le migrazioni una per una (vedi To remove last migrationsopra).

Per annullare l'applicazione e rimuovere l'ultima migrazione:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

Continuo a vedere la parola in unapplytutti questi post. Mi ha colpito non è un termine tecnico, è la parolaun - apply
Helzgate,

28

Per ripristinare l'ultima migrazione applicata, è necessario (comandi della console di gestione pacchetti):

  1. Ripristina migrazione dal database: PM> Update-Database <prior-migration-name>
  2. Rimuovi il file di migrazione dal progetto (o verrà nuovamente applicato al passaggio successivo)
  3. Snapshot del modello di aggiornamento: PM> Remove-Migration

UPD : il secondo passaggio sembra non essere richiesto nelle ultime versioni di Visual Studio (2017).


1
Grazie! Questo ha funzionato perfettamente affascinato che di tutte le soluzioni nessuno ha mai menzionato la necessità di fase 2.
Michael Kargl

Sì, nessuno ha menzionato il secondo passaggio. Grazie
Ajas Aju,

non sono sicuro del secondo passaggio, nel mio caso (ultimo VS2017) il file di migrazione verrà eliminato automaticamente dopo aver chiamato Remove-Migrationsenza problemi. Non sono sicuro di quello che hai detto "verrà riapplicato di nuovo al prossimo passaggio"!
S. Serpooshan,

@Serpooshan In effetti. L'ho eliminato manualmente ma quando ho eseguito Remove-Migration si è lamentato del fatto che la mia migrazione precedente fosse stata applicata al database. Ma funziona.
MetalMikester,

Il secondo passo penso sia necessario solo se chiami dbContext.Database.Migrate()in startup.cs
user3413723

23

Puoi semplicemente scegliere come target una migrazione per valore

 Update-Database -Migration:0

Quindi vai avanti e rimuovilo

 Remove-Migration

1
Questo ha funzionato per me ma sto usando EF e .NET core 2.0 con VS2017
James Morrison,

2
Attenzione: -Migrazione: 0 significa tornare allo stato senza migrazioni. Questo cancellerà il tuo database
Kieren Johnstone,

Sì secondo la domanda posta. È possibile aumentare il valore in base alla migrazione a cui si desidera eseguire il rollback
John Nyingi,

11

Per "annullare l'applicazione" la migrazione più (recente?) Dopo che è già stata applicata al database:

  1. Apri Esplora oggetti di SQL Server (Visualizza -> "Esplora oggetti di SQL Server")
  2. Passare al database collegato al progetto espandendo i triangoli di lato.
  3. Espandi "Tabelle"
  4. Trova la tabella denominata "dbo._EFMigrationsHistory".
  5. Fai clic destro su di esso e seleziona "Visualizza dati" per vedere le voci della tabella in Visual Studio.
  6. Elimina la riga corrispondente alla tua migrazione che desideri non applicare (di '"sì" all'avviso, se richiesto).
  7. Esegui "dotnet ef migrations remove" di nuovo nella finestra di comando nella directory che ha il file project.json. In alternativa, eseguire il comando "Rimuovi migrazione" nella console del gestore pacchetti.

Spero che questo aiuti ed sia applicabile a qualsiasi migrazione nel progetto ... Ho provato questo solo alla migrazione più recente ...

Buona programmazione!


21
Questo in realtà non annullerà l'applicazione della migrazione, ma farà "pensare" che il framework non sia stato applicato. In questo caso, il database si troverà in uno stato incoerente.
mark.monteiro,

La modifica manuale dei dati in __EFMigrationsHistory è un consiglio terribile. Non farlo Quella tabella deve essere utilizzata solo dagli strumenti di migrazione. Se inizi a modificare manualmente i dati, un singolo errore può creare tutti i tipi di pazzi comportamenti imprevisti nel tuo progetto. È un'idea molto migliore utilizzare una delle altre soluzioni consigliate.
Joe Irby,

Abbiamo avuto una situazione in cui un membro del team junior si è confuso con il cambio di filiali e alla fine abbiamo eliminato la migrazione manualmente da entrambi (anche se era ancora nella tabella __EFMigrationsHistory da quando era già stata applicata), quindi abbiamo perso il "down". Questo è ciò che abbiamo dovuto fare, oltre ad alcune inversioni manuali in SSMS. Quindi non farlo - a meno che tu non abbia altra scelta a questo punto. Almeno tutto ciò che ha fatto è stato aggiungere un singolo nuovo campo.
Ella,


10

È necessario eliminare il record di migrazione '20160703192724_MyFirstMigration' dalla tabella '_EFMigrationsHistory' .

altrimenti questo comando rimuoverà la migrazione e cancellerà la cartella migrazioni:

   > remove-migration -force

7

In generale, se si utilizza la Console Gestione pacchetti, il modo corretto per rimuovere una migrazione specifica è fare riferimento al nome della migrazione

Update-Database -Migration {Name of Migration} -Context {context}

Un altro modo per rimuovere l'ultima migrazione che hai applicato in base ai documenti è usando il comando:

dotnet ef migrations remove

Questo comando deve essere eseguito dal prompt dei comandi dello sviluppatore ( come aprire il prompt dei comandi ) all'interno della directory della soluzione.

Ad esempio, se l'applicazione è all'interno del nome "Applicazione" e si trova nella cartella c: \ Progetti. Quindi il tuo percorso dovrebbe essere:

C:\Projects\Application

1
La domanda era cosa fare se "dotnet ef migrations remove" restituisce un errore "La migrazione è già stata applicata al database"
Michael Freidgeim

2

Per annullare l'applicazione di una migrazione in EF Core 1.0, utilizzare il comando:

aggiornamento database dotnet ef {migration_name}

Utilizzare il nome della migrazione della migrazione fino al quale si desidera conservare le modifiche. L'elenco dei nomi della migrazione può essere trovato utilizzando:

elenco di migrazioni di dotnet ef


2

Per ripristinare tutte le migrazioni applicate al DB è sufficiente eseguire:

update-database 0

Dovrebbe essere seguito con l'esecuzione Remove-Migrationtante volte quante sono i file di migrazione visibili nella directory Migrazione. Il comando cancella l'ultima migrazione e aggiorna anche l'istantanea.


1

all'inizio esegui il seguente comando:

PM>update-database -migration:0

e quindi esegui questo:

PM>remove_migration

finire


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

await context.Database.EnsureDeletedAsync();

-1

1.Trova la tabella "dbo._EFMigrationsHistory", quindi elimina il record di migrazione che desideri rimuovere. 2. eseguire "remove-migration" in PM (Package Manager Console). Per me va bene.


Ciò porterà a uno stato incoerente del database (ad es. Una colonna è già stata eliminata)
Mai
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.