2012-03-29 5 views
6

Ho un'istanza locale di un database che ho creato recentemente utilizzando DbContext.Database.Create(), pertanto la tabella __MigrationHistory esiste con una voce InitalCreate che corrisponde al codice al momento.Crea migrazioni in attesa di codice EF4.3 Ignora migrazioni in sospeso

Alcune migrazioni basate su codice sono presenti nella cartella Migrazioni, tuttavia. Questi verranno eseguiti nei nostri ambienti di sviluppo e di staging per portare tali database in linea con il codice. Non ho bisogno di applicarli localmente, tuttavia, dal momento che ho creato il database utilizzando il codice corrente.

Ora devo apportare una modifica al modello e creare la migrazione corrispondente. Ma quando ho eseguito Add-Migration TestMigration, ottengo il seguente errore

Unable to generate an explicit migration because the following explicit 
migrations are pending: 

[201203271113060_AddTableX, 
201203290856574_AlterColumnY] 

Apply the pending explicit migrations before attempting to generate 
a new explicit migration. 

Cosa devo fare in questo caso? Non riesco a puntare lo strumento Add-Migration in un altro ambiente perché non è garantito che la versione corrisponda a quello che ho localmente. Voglio una migrazione che corrisponda solo alle modifiche che ho apportato.

Mi sembra di avere un paio di opzioni, ma nessuno sono l'ideale:

  1. Eliminare le altre migrazioni dalla cartella Migrazioni, eseguire il comando Add-migrazione, l'aggiornamento del database, quindi ripristinare le vecchie migrazioni. Questo è semplice ma sembra un po 'hackerato.
  2. Ripristinare la versione del modello nel controllo del codice sorgente a cui è stata applicata la prima migrazione, quindi creare questo e utilizzarlo per creare il database. Quindi ottieni l'ultima versione, applica tutte le migrazioni, quindi sono pronto per aggiungere la mia migrazione. Questo sembra un grande sforzo!
  3. Creare la migrazione manualmente.

Qualcuno ha qualche suggerimento su come gestirlo?

risposta

2

Quello che ho trovato funziona meglio è molto semplice: non utilizzare DbContext.Database.Create() una volta che hai attivato migrazioni. Se si desidera creare un nuovo database al livello di programmazione, utilizzare invece l'API di migrazione.

var migrator = new DbMigrator(new Configuration()); 
migrator.Update(); 

Quindi la cronologia completa della migrazione e l'aggiunta di ulteriori migrazioni funzionano come previsto.

2

Stiamo progettando di utilizzare una variante della vostra opzione # 1 ...

nostro Standard Operating Procedure è quello di generare uno script SQL per ogni migrazione (utilizzando l'opzione di aggiornamento -script-database), al fine di disporre di script SQL da applicare ai database di "produzione" dell'utente finale da parte di InstallShield (si prevede di utilizzare il database di aggiornamento EF solo per i database degli sviluppatori).

Così, abbiamo entrambi i file .cs di Migrazione e i corrispondenti file .sql per tutte le migrazioni nella nostra cartella Migrazioni.

Quindi, anziché eliminare le migrazioni dalla cartella Migrazioni (come proposto nella # 1), utilizziamo SQL Mgmt Studio per applicare manualmente solo le parti dei file .sql che inseriscono gli inserimenti in _MigrationHistory.

Ciò consente di aggiornare la _MigrationHistory del database locale con le modifiche già incorporate nel database.

Ma è un gioco da ragazzi, e stiamo ancora cercando una soluzione migliore.

DadCat

1

Ho riscontrato lo stesso problema. Se si esegue

Update-database 

e quindi eseguire

Add-Migration YourMigrationName 

Questo risolve il problema

+1

Questo non funziona perché le precedenti operazioni di migrazione non possono essere eseguite su un database che è stato creato usando 'DbContext.Database.Create()'. Immagina una migrazione che aggiunge una colonna, ma nel tuo nuovo database locale hai già quella colonna in modo da ottenere un 'SqlException' e la riga pertinente non viene mai aggiunta alla tabella' __MigrationHistory'. Vedi la mia risposta per quello che penso sia l'approccio corretto. –

1

È necessario eseguire "update-database" dalla console del gestore pacchetti per inviare le modifiche al database OPPURE è possibile eliminare il file di migrazione in sospeso ([201203271113060_AddTableX]) dalla cartella Migrazioni e quindi eseguire nuovamente "aggiungi-migrazione "per creare una nuova migrazione basata sulle tue modifiche.

0

semplicemente esclude il vecchio file di migrazione dai file di soluzione.