Ripristina migrazioni Entity-Framework


299

Ho confuso le mie migrazioni, ho usato IgnoreChangesla migrazione iniziale, ma ora voglio eliminare tutte le mie migrazioni e iniziare con una migrazione iniziale con tutta la logica.

Quando elimino le migrazioni nella cartella e provo e Add-Migrationnon genera un file completo (è vuoto - perché non ho apportato modifiche dalla mia ultima, ma ora cancellata, migrazione).

Esiste un comando Disable-Migrations , quindi posso rieseguire Enable-Migrations?



3
Una nota importante se hai più stringhe di connessione: specifica quale utilizzare quando ripristini le migrazioni, altrimenti proverà ad applicarsi a entrambe, che potrebbero causare problemi in caso di discrepanze.
Jeroen Vannevel,

Nota: se non hai cancellato le tue migrazioni (usi il controllo della versione giusto?), Potresti aver aggiornato il tuo db - alla prima migrazione, quindi eliminato la mitigazione e creato nuove migrazioni da quel punto. Vedi qui: stackoverflow.com/a/23793384/309634
DarcyThomas

Risposte:


446

Devi :

  1. Elimina lo stato: elimina la cartella migrazioni nel tuo progetto; E
  2. Elimina la __MigrationHistorytabella nel tuo database (potrebbe trovarsi sotto le tabelle di sistema); Poi
  3. Esegui il comando seguente nella console di Package Manager:

    Enable-Migrations -EnableAutomaticMigrations -Force

    Utilizzare con o senza -EnableAutomaticMigrations

  4. E infine, puoi eseguire:

    Add-Migration Initial

5
^^ Capito - è stato un errore TFS - se stai usando TFS devi eseguire un check-in prima di eseguire il comando "Enable-Migrations ...". : D
BrainSlugs83

7
Se non stai utilizzando il controllo versione, salva i valori di seed prima di eliminarli!
RyanJMcGowan,

77
@RyanJMcGowan se non stai usando il controllo versione, ti meriti di perdere il lavoro. :-)
Mike Cole,

4
@Tood. +1 a quello. Mi ha risparmiato un sacco di tempo. Ora, se solo il team EF potesse incorporare tutto ciò in un comando Reset-Migrations. Forse EF 6 ...
Gerald Davis

24
Per un database esistente, è necessario commentare il contenuto della funzione "Su". Altrimenti riceverai un errore quando esegui "Update-Database", si lamenterebbe che la tabella esiste già
Guy

149

Il problema: hai risolto il problema delle migrazioni e desideri ripristinarlo senza eliminare le tabelle esistenti.

Il problema: non è possibile ripristinare le migrazioni con tabelle esistenti nel database poiché EF desidera creare le tabelle da zero.

Cosa fare:

  1. Elimina le migrazioni esistenti dalla tabella Migrations_History.

  2. Elimina le migrazioni esistenti dalla cartella Migrazioni.

  3. Esegui il ripristino add-migrazione. Ciò creerà una migrazione nella cartella Migrazione che include la creazione delle tabelle (ma non la eseguirà, quindi non si guasterà).

  4. Ora è necessario creare la riga iniziale nella tabella MigrationHistory in modo che EF abbia un'istantanea dello stato corrente. EF lo farà se si applica una migrazione. Tuttavia, non è possibile applicare la migrazione appena effettuata poiché le tabelle esistono già nel database. Quindi vai nella Migrazione e commenta tutto il codice all'interno del metodo "Up".

  5. Ora esegui update-database. Applicherà la migrazione (pur non modificando effettivamente il database) e creerà una riga dell'istantanea in MigrationHistory.

Hai reimpostato le tue migrazioni e potresti continuare con le normali migrazioni.


11
Questa è l'unica risposta che ha funzionato per me. La risposta accettata non sembra risolvere il problema di ciò che accade quando si esegue Update-Database o si esegue l'applicazione (a seconda del tipo di inizializzatore che si sta utilizzando). Tenterà di eseguire la migrazione e tenterà di apportare modifiche già esistenti. A meno che non mi manchi qualcosa.
regularmike,

2
È anche la risposta più flessibile. Nel mio caso ci sono stati alcuni cambiamenti che avevo bisogno di applicare e altri no. Potrei semplicemente tenere le cose utili nel mio Up ().
tec-goblin,

1
@ H. Johnson, l'ho visto. Hai una domanda al riguardo?
Greg Gum,

2
Una cosa da tenere presente, da EF 6.0 la tabella _MigrationsHistory contiene migrazioni per più DBContexts. L'eliminazione può causare problemi, è necessario eliminare solo le righe in cui ContextKey = il nome della migrazione. Anche dopo 2 sopra ho dovuto abilitare di nuovo le migrazioni
David Waterworth il

2
Essenzialmente la stessa risposta, con un esempio esteso (con schermate): weblog.west-wind.com/posts/2016/Jan/13/…
nmit026

30

Che ne dite di

Update-Database TargetMigration: $InitialDatabase

nella console di Package Manager? Dovrebbe ripristinare tutti gli aggiornamenti allo stato iniziale.

Link di riferimento: Code First Migrations - Migrazione a una versione specifica (incluso il downgrade)


Penso che la mia frustrazione principale non fosse più fidarmi delle migrazioni per mantenere accuratamente lo stato. E come risultato voler iniziare da zero.
Todd,

@Todd, sono inciampato e non è stato sempre chiaro se dovessi eliminare i file di migrazione per ricominciare tutto da capo. Ora sta funzionando come segue: 1. ripristina l'iniziale usando il comando "Update-Database –TargetMigration: $ InitialDatabase". 2. Rimuovere tutti i file di migrazione (denominati utilizzando yyyyMMddHHmmssx_Name.cs o .vb) 3. Aggiornare l'aggiornamento utilizzando 'add-Migration -Name some_name'. 4. Emettere l'aggiornamento in modo che influisca sul database utilizzando "update-Database". Spero che funzioni per te.
Chris Voon,

Nel mio caso, il comando suggerito in questa risposta ha provocato errori SQL.
Justin Skiles,

cosa dovrebbe significare "InitialDatabase"? eliminerà le tabelle o le colonne già create nel DB?
Serge,

16

Per risolvere questo problema, devi:

  1. Elimina tutti i file * .cs nella cartella Migrazioni.

  2. Elimina la tabella _MigrationHistory nel database

  3. Correre Enable-Migrations -EnableAutomaticMigrations -Force

  4. Correre Add-Migration Reset

Quindi, nella public partial class Reset : DbMigrationclasse, devi commentare tutte le tabelle esistenti e attuali:

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

Se ti manca questo bit, tutto fallirà e dovrai ricominciare!

  1. Adesso corri Update-Database -verbose

Questo dovrebbe avere successo se hai fatto correttamente quanto sopra e ora puoi continuare normalmente.


2
Invece di commentare tutto, puoi anche scrivere "return;" nella prima riga del metodo Up ().
chaintair

6

Considerando che questo appare ancora quando cerchiamo EF in .NET Core, posterò la mia risposta qui (dal momento che mi ha perseguitato molto). Si noti che ci sono alcune sottigliezze con la versione EF 6 .NET (nessun comando iniziale e sarà necessario eliminare i file "Snapshot")

(Testato in .NET Core 2.1)

Ecco i passaggi:

  1. Elimina la _efmigrationhistorytabella.
  2. Cerca l'intera soluzione per i file che contengono Snapshot nel loro nome, ad esempio ApplicationDbContextSnapshot.cs, ed eliminali .
  3. Ricostruisci la tua soluzione
  4. Correre Add-Migration InitialMigration

Nota: è necessario eliminare TUTTI i file Snapshot . Ho trascorso innumerevoli ore a cancellare il database ... Questo genererà una migrazione vuota se non lo fai.

Inoltre, in # 3 puoi semplicemente nominare la tua migrazione come preferisci.

Ecco alcune risorse aggiuntive: asp.net CORE Migrazioni generate vuote

Ripristina migrazioni Entity Framework 7


3

In EntityFramework 6, prova:

Add-Migration Initial

per aggiornare il file di migrazione iniziale.


3

In Entity Framework Core.

  1. Rimuovi tutti i file dalla cartella delle migrazioni.
  2. Digita console

drop database dotnet ef -f -v

dotnet ef migrations aggiunge Initial

aggiornamento database dotnet ef


2

Il mio problema si è rivelato essere che ho rimosso manualmente la cartella Migrations. L'ho fatto perché volevo eseguire il backup dei contenuti, quindi ho semplicemente trascinato la cartella fuori dal progetto. Successivamente ho risolto il problema reinserendolo (dopo aver effettuato una copia di backup), quindi rimuovendo la cartella Migrazioni facendo clic con il pulsante destro del mouse in Esplora soluzioni e scegliendo Elimina dal menu a comparsa.


1

In EF6

  1. Elimina tutti i tuoi file nella cartella "migrations" ... Ma non la "creazione iniziale" o "config".
  2. Elimina il database.
  3. Adesso corri Add-Migration Initial .
  4. Ora puoi "aggiornare il database" e tutto andrà bene.

1

Elimina la Migrationscartella, Cleanquindi Rebuildil progetto. Questo ha funzionato per me. Prima di Clean and Rebuild stava dicendo che la migrazione esiste già poiché nella sua memoria cache non è ancora stata eliminata.


0

Questo metodo non richiede l'eliminazione della __MigrationHistorytabella, quindi non è necessario mettere le mani sul database per la distribuzione.

  1. Elimina le migrazioni esistenti dalla cartella Migrazioni.
  2. Nella console di Package Manager eseguita Add-Migration ResetMigrations
  3. Pulisci la cronologia delle migrazioni nel Up()metodo:
/// <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()
    {
    }
}

0

In Net Core 3.0:

Non sono riuscito a trovare un modo per ripristinare le migrazioni .

Ho anche riscontrato problemi con migrazioni interrotte e le risposte fornite qui non hanno funzionato per me. Ho un'API Web .Net Core 3.0 e da qualche parte nell'ultimo mese ho modificato direttamente il database. Sì, ho fatto una brutta cosa.

Le strategie suggerite qui hanno comportato una serie di errori nella console di Package Manager:

  • Esiste già una migrazione con quel nome
  • Impossibile trovare l'istantanea
  • 'Forza' non è un parametro riconosciuto

Certo, potrei aver perso un passaggio o aver perso i file corretti, ma ho scoperto che ci sono modi per ripulirlo senza troppa forza bruta:

  • Rimuovi migrazione da PMC per ogni migrazione per nome, in ordine inverso rispetto alla creazione, fino alla migrazione interrotta inclusa
  • Add-Migration per creare una nuova migrazione che sarà il delta tra l'ultima migrazione valida fino allo schema corrente

Ora, quando l'API Web viene avviata con un database vuoto, crea correttamente tutte le tabelle e le proprietà in modo che corrispondano ai modelli di entità.

HTH!


0

AGGIORNAMENTO 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => Il tuo contesto.


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.