2013-05-17 13 views
14

Dopo aver cambiato filiali in controllo del codice sorgente, in esecuzione Update-Database per ripristinare una migrazione precedente, EF a volte visualizzerà il testo "Ripristino migrazione automatica", come di seguito:Che cosa significa "Ripristino della migrazione automatica"?

Reverting automatic migration: 201305171619008_DescriptiveNameForMigration. 
Reverting code-based migration: 201305162023299_Init. 

Come ha fatto Entity Framework determinare che il la migrazione dovrebbe essere automatica e cosa fa in modo diverso?

Ecco come riprodurlo, a patto di avere un progetto con le migrazioni in codice prima già di impostazione:

  1. passare a una nuova filiale a controllo del codice sorgente
  2. apporta una modifica al modello mapper, e aggiungi una migrazione
  3. Update-Database
  4. Tornate al ramo di default
  5. -TargetMigration Update-database: 0 -Force
  6. Vedere "Ripristino della migrazione automatica" nei risultati dal comando Update-Database

Questo è ciò che PENSO sta accadendo, correggimi se ho torto.

  • Update-Database enumera le migrazioni in __MigrationHistory
  • trova il file di migrazione corrispondenti nel progetto e chiama il metodo di Down()
  • Se un file di migrazione corrispondente non esiste, allora esegue un best -guess su come ripristinare la migrazione sulla base della snapshot in __MigrationHistory
+0

Penso che tu abbia descritto bene. –

+0

Il metodo down nel codice è stato ripristinato? Quindi aveva un percorso per recuperare una versione presente nella tabella MigrationHistory. tipo di come previsto non pensi? –

+0

Se il file di codice esiste per la migrazione, verrà utilizzato il metodo Down(). Mi chiedo come funziona il "ripristino della migrazione automatica" quando un file di codice non esiste per il ripristino della migrazione. (Forse è appropriato per una nuova domanda SO.) Anche tu pensi che "ripristinare la migrazione automatica" significa che genera il metodo Down() al volo? –

risposta

3

Quando si patibolo una migrazione, Entity Framework eseguirà un diff tra l'ultimo modello registrato nel __MigrationsHistory e il modello attuale e creare un Migrat classe di ioni contenente quella diff. Sei libero di modificare sia i metodi Su e Giù di quella migrazione scaffoldata.

Le migrazioni automatiche consentono di saltare l'impalcatura. Se sono abilitati e si chiama Update-Database, eseguirà un diff del modello corrente e l'ultimo modello registrato in __MigartionsHistory e applicherà tale diff utilizzando una migrazione "automatica". La migrazione automatica ottiene ancora un record in __MigrationHistory, ma non ci sarà alcuna classe di migrazione aggiunta al progetto. I passaggi del diff sono gli stessi che sarebbero stati impalcati nel metodo Up, ma non c'è mai l'opportunità di personalizzarlo.

Quando si ripristina una di queste migrazioni automatiche, esegue un diff del modello che ha registrato e il modello della migrazione precedente. Questi passaggi sono gli stessi che sarebbero stati nel metodo Down impalcato.

Se Entity Framework non riesce a trovare la classe di migrazione per una migrazione, presuppone che si tratti di una migrazione automatica. Pertanto, se hai personalizzato il metodo Giù, nessuna di queste personalizzazioni verrà applicata durante il ripristino.

Speriamo che questo renda le cose un po 'più chiare.

+0

È utile sapere che la migrazione automatica viene registrata quando rileva una modifica senza un file di migrazione corrispondente. Finora, ho notato solo il mix di messaggi automatici e basati su codice mentre eseguivo il backup delle modifiche. Grazie per i dettagli. :) –