2013-10-30 13 views
8

Stiamo utilizzando le migrazioni Code-first con EF5 su (localdb) \ v11.0 (Vstudio 2012) e tutto ha funzionato bene finora.Impossibile generare la migrazione esplicita (EF5) (migrazioni in sospeso)

Tuttavia, oggi avevo bisogno di creare un paio di indici su alcuni tavoli e ho incontrato problemi.

Per prima cosa ho fatto questo in PM:

PM> add-migration AddIdxToOutage 
Scaffolding migration 'AddIdxToOutage'. 

ho modificato il codice di migrazione ponteggi a:

public override void Up() 
     { 
      Sql(@"CREATE NONCLUSTERED INDEX [idx_WtgId_StartDateTime_EndDateTime] ON [dbo].[Outages] 
(
    [WtgId] ASC, 
    [StartDateTime] ASC, 
    [EndDateTime] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]"); 
     } 

ho aggiornato il database e il risultato è stato questo:

PM> update-database -startupprojectname D3A.Data -force -verbose 
Using StartUp project 'D3A.Data'. 
Using NuGet project 'D3A.Data'. 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
Target database is: 'D3A.Data.StorageContext' (DataSource: (localdb)\v11.0, Provider: System.Data.SqlClient, Origin: Convention). 
Applying code-based migrations: [201310301258520_AddIdxToOutage]. 
Applying code-based migration: 201310301258520_AddIdxToOutage. 
CREATE NONCLUSTERED INDEX [idx_WtgId_StartDateTime_EndDateTime] ON [dbo].[Outages] 
(
    [WtgId] ASC, 
    [StartDateTime] ASC, 
    [EndDateTime] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
[Inserting migration history record] 
Running Seed method. 

L'idx è stato creato sul tavolo e tutti erano felici.

Tuttavia, quando ho creato l'indice successivo, ho riscontrato dei problemi. Ho creato un compito di migrazione vuota come

PM> add-migration AddIdxToState 
Unable to generate an explicit migration because the following explicit migrations are pending: [201310301258520_AddIdxToOutage]. Apply the pending explicit migrations before attempting to generate a new explicit migration. 

Pardon il mio francese - ma WT *?

Sembra non esserci alcun modo per aggirare questo. Posso ritornare al passaggio di migrazione che precede l'aggiunta del primo idx, aggiungere di nuovo l'idx e la stessa cosa accade di nuovo.

Puoi dirmi cosa mi manca qui? Che cosa sto facendo di sbagliato?

Edit:

Inizialmente ho pensato che il mio problema era in esecuzione SQL prime nel database/LocalDB, ma sembra che tutto quello che faccio ora si ferma dopo il primo add-migrazione.

Ho appena aggiunto una nuova tabella al database e questo è il risultato STD-out da PM Console:

PM> add-migration AddMyLoggerTable 
Scaffolding migration 'AddMyLoggerTable'. 
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration 201310301419063_AddMyLoggerTable' again. 
PM> update-database -startupproject DongEnergy.D3A.Data -verbose 
Using StartUp project 'D3A.Data'. 
Using NuGet project 'D3A.Data'. 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
Target database is: 'D3A.Data.StorageContext' (DataSource: (localdb)\v11.0, Provider: System.Data.SqlClient, Origin: Convention). 
Applying code-based migrations: [201310301419063_AddMyLoggerTable]. 
Applying code-based migration: 201310301419063_AddMyLoggerTable. 
CREATE TABLE [dbo].[MyLoggerTable] (
    [id] [int] NOT NULL, 
    [functionId] [int], 
    [elapsedTime] [bigint], 
    [noOfRecords] [int], 
    [dateCreated] [datetime] DEFAULT getDate() 
) 
[Inserting migration history record] 
Running Seed method. 
PM> add-migration AddMyLoggerTableFunction 
Unable to generate an explicit migration because the following explicit migrations are pending: [201310301419063_AddMyLoggerTable]. Apply the pending explicit migrations before attempting to generate a new explicit migration. 

Si noti come posso aggiungere un nuovo compito di migrazione vuota, utilizzare il CreateTable metodo e hanno aggiornato con successo nel database. Ma quando aggiungo un nuovo passaggio di migrazione, si lamenta che l'attività che è stata appena "impegnata" nel database è ancora "in sospeso", anche se sia la migrazione che gli oggetti del database sono stati aggiornati.

+0

Prova: ripristina, elimina la migrazione e la ricrea. Ho avuto problemi con le migrazioni "vuote" un paio di volte, ma questo semplice trucco lo ha sempre fatto. –

+0

@allo_man, beh, ci ho provato. Sono tornato alla fase di migrazione/prima/alla creazione dell'indice. Questo ha funzionato bene. Poi ho aggiunto il primo passo per creare l'indice. Funzionava bene e il database di aggiornamento funziona come previsto. Quando aggiungo una migrazione per creare un secondo indice, ciò non riesce. –

+0

La prima migrazione ha creato la sua voce nella tabella __MigrationHistory? – Adrian

risposta

8

Questo potrebbe non risolvere la domanda OP, ma ho avuto un problema simile quando stavo sviluppando un nuovo database e ho provato ad aggiungere due migrazioni prima di fare qualsiasi aggiornamento al database.

La mia soluzione era eseguire la mia applicazione in modo che le migrazioni in sospeso potessero aggiornare il database. L'applicazione aggiorna il database automaticamente con l'aiuto di uno MigrateDatabaseToLatestVersion. Ciò può essere effettuato digitando Update-Database anche dalla console di Gestione pacchetti.

Se viene aggiunta una migrazione e vengono apportate ulteriori modifiche che devono essere aggiunte alla stessa migrazione, non è inoltre necessario rimuoverla e riaggiungerla (cosa che ho cercato di fare inizialmente). È possibile solo aggiornare la migrazione in sospeso esistente, la guida viene visualizzata quando si esegue lo strumento Add-Migration dalla Console Gestione pacchetti (sottolineatura da me).

Il codice di progettazione per questo file di migrazione include un'istantanea del modello corrente del primo codice . Questa istantanea viene utilizzata per calcolare le modifiche al modello quando si esegue lo scaffold della migrazione successiva. Se si apportano ulteriori modifiche al tuo modello di che si desidera includere in questa migrazione, allora è possibile ri-impalcatura che eseguendo 'Add-migrazione [timestamp] _MigrationName' di nuovo.

In altre parole, eseguire lo strumento Add-Migration con lo stesso Id dell'operazione in sospeso e le nuove modifiche verranno unite al vecchio. Se si nota che le modifiche non vengono unite, è possibile utilizzare il flag(come in Add-Migration <Name> -Force) per forzare la migrazione, come note di anthony-arnold nei commenti.

+20

Usa il '-Force', Luke. – Anthony

2

giusto è caso qualcuno è interessato mi sono imbattuto nel "Impossibile generare una migrazione esplicita, perché i seguenti migrazioni espliciti sono in attesa ..." errore dopo ho cambiato il valore diContextKey nel file Configuration.cs. L'ho cambiato e il problema è andato via.

+1

Questo è stato il caso anche per il mio progetto. Invece di modificare il ContextKey ho regolato manualmente il nuovo valore nella tabella _MigrationHistory nel database. Anche questo ha risolto il problema. –

4

Un'altra possibile ragione è - se si dispone di diversi progetti nella soluzione come - UI e Core (la configurazione db è qui), quindi assicurarsi che durante l'esecuzione del progetto di migrazione Core è impostato come progetto di avvio. Ha risolto il mio problema. Codifica felice :)

+0

Santa mucca! Perché funziona? Grazie Tonu. – Jess

Problemi correlati