15

Ho aggiunto EF 5 al mio progetto tramite Nuget e abilitato le migrazioni con il comando "Abilita-Migrazioni". Ho quindi chiamato "Add-Migration" per generare il codice base per generare lo schema.Migrazioni del codice quadro entità - bloccato sulla migrazione iniziale

Ho quindi aggiunto una proprietà a uno dei miei oggetti dominio (proprietà stringa denominata "TestProperty") e aggiunto una mappatura al file EntityTypeConfiguration (stiamo ignorando le convenzioni al momento).

Calling "Add-migrazione" ancora una volta produce l'errore:

Unable to generate an explicit migration because the following explicit migrations are pending: [201303262144218_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration. 

Ma chiamando "Update-Database" produce un'eccezione SQL perché esistono già le tabelle:

There is already an object named 'Customer' in the database 

Nel mio costruttore il mio DbContext Ho provato le diverse strategie di aggiornamento, ad esempio:

Database.SetInitializer<UnitOfWork>(new DropCreateDatabaseAlways<UnitOfWork>()); 

Sono missi qualcosa di ovvio? Ho provato la soluzione qui, ma non ha funzionato: Automatic Migrations for ASP.NET

Grazie

EDIT: aggiornamento La chiave per ottenere oltre il primo passo è quello di creare la migrazione iniziale e quindi eliminare il codice generato dal Up e giù (http://thedatafarm.com/blog/data-access/using-ef-migrations-with-an-existing-database/).

Posso quindi aggiornare il modello e la mappa EF e quindi eseguire Add-Migration. Ciò genera una migrazione con il codice Up and Down corretto.

Il problema è quindi provare ad applicare l'aggiornamento. Update-Database genera l'errore "Impossibile aggiornare il database in modo che corrisponda al modello corrente perché ci sono modifiche in sospeso e la migrazione automatica è disabilitata ... migrazione automatica Imposta DbMigrationsConfiguration.AutomaticMigrationsEnabled su true per abilitare la migrazione automatica Puoi usare Comando di migrazione per scrivere le modifiche del modello in sospeso a una migrazione basata su codice ". Ok, quindi provo di nuovo Add-Migration e produce un'altra migrazione con lo stesso codice identico all'ultimo.

Eseguo Update-Database e restituisco lo stesso errore. Provo "Update-Database -TargetMigration 201304080859556_MyMigration -Force" ma questo produce "La migrazione target specificata '201304080859556_MyMigration' non esiste. Assicurati che la migrazione target faccia riferimento a un ID di migrazione esistente" - Funziona!

Molto frustrante!

+0

Esiste un file esistente nella directory Migrations denominata 201303262144218_Initial.cs? – MattSull

+0

Sì. Sono un po 'confuso - la migrazione iniziale dovrebbe essere vuota o si suppone che crei il database nel suo stato iniziale? Inoltre, non ho una tabella __MigrationHistory (nel mio database o nel master) – SturmUndDrang

+0

Iniziale è solo un nome dato a quella particolare migrazione. A volte le persone chiamano la loro prima iniziale di migrazione. Se si disponeva di un db esistente e si eseguiva il comando add-migration/update-database senza apportare modifiche alle classi del modello, il file di migrazione sarebbe vuoto. Eliminare il file 201303262144218_Initial.cs e quindi eseguire nuovamente i due comandi ('aggiungi-migrazione nuovaMigrazione' quindi 'aggiornamento-database'. – MattSull

risposta

3

Si è provato a utilizzare il parametro -force per applicare le modifiche.

Update-Database [-SourceMigration <String>] 
    [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>] 
    [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] 
    [-ConnectionStringName <String>] [<CommonParameters>] 

-Force Specifica che la perdita di dati è accettabile durante la migrazione automatica del database .

È possibile utilizzare get-help Update-Database -examples per vedere esempi di utilizzo.

Ulteriore lettura: EF Code First Migrations

+0

Ok, quindi ho eliminato la migrazione iniziale ed eseguo Enable-Migrations (con -Force) che non ha creato una migrazione iniziale, quindi ho eseguito Add-Migration (specificando la stringa di connessione) che ha creato una migrazione che crea l'intero database (non solo la proprietà extra che ho aggiunto). – SturmUndDrang

+1

Quindi eseguo Update-Database con - FORCE e ricevo "Impossibile aggiornare il database in modo che corrisponda al modello corrente perché ci sono modifiche in sospeso e la migrazione automatica è disabilitata." Scrivi le modifiche del modello in sospeso a una migrazione basata su codice o attiva la migrazione automatica. "Perché è così difficile ottenere questo funziona? – SturmUndDrang

+0

Ho provato anche il flag -esamples, dice solo "NAME Update-Database SYNOPSIS Applica eventuali migrazioni in sospeso al database" senza fornire esempi. – SturmUndDrang

0

Questo è un approccio coperta che di solito funziona:

  1. Eliminare l'intera cartella Migrazioni (assicurarsi di copiare qualsiasi codice che si potrebbe aver creato dal metodo seme il tuo file di configurazione della migrazione).
  2. Elimina il database attuale. Se si utilizza LocalDb, questo si posizionerà normalmente all'interno della cartella della soluzione AppData (fare clic con il pulsante destro del mouse -> aprire il percorso della cartella). Assicurati di eliminare i file .mdf & .log del database.
  3. Passare alla console di Gestione pacchetti. Immettere enable-migrations -projectname yourprojectname
  4. Passare alla console di Gestione pacchetti. Inserisci add-migration "Initial" -projectname yourprojectname.
  5. Aprire il file di configurazione della migrazione e incollare il codice copiato dal passaggio 1 nel metodo seme.
  6. Passare alla console di Gestione pacchetti. Inserire update-database -projectname yourprojectname

Questo dovrebbe fare il trucco.

4

I run Update-Database and get the same error again. I try "Update-Database -TargetMigration 201304080859556_MyMigration -Force" but this produces "The specified target migration '201304080859556_MyMigration' does not exist. Ensure that target migration refers to an existing migration id" - It does!

C'è un altro problema che può causare l'ultimo errore (e forse è la causa principale di quelli precedenti). Ho avuto un problema simile e ho scoperto che per qualche strano motivo alcune delle mie classi di migrazione erano in uno spazio dei nomi diverso rispetto allo spazio dei nomi della mia classe MigrationConfiguration. La correzione degli spazi dei nomi (anche nei file xxx.Designer.cs) risolveva questo problema (le migrazioni erano visibili e funzionavano di nuovo).

+2

Ho incontrato quasi lo stesso problema oggi (il nome di classe parziale nel file di progettazione era stato modificato, molto probabilmente a causa di un'unione di codice). Una volta risolto il file del designer, sono stato in grado di applicare tutte le mie migrazioni. – DVK

+0

Prova "Update-Database -TargetMigration MyMigration -Force" – gorums

20

Ho avuto lo stesso problema consentendo migrazioni EF per un modello di codice-primo con un database esistente, e la seguente procedura lavorato:

  1. rimuovere la cartella Migrazioni esistente nel progetto, ed eliminare la tabella __MigrationHistory da il database esistente.
  2. Eseguire il comando enable-migrations dalla console di Gestione pacchetti.
  3. Eseguire il comando add-migration per creare una migrazione iniziale.
  4. Rimuovere tutto il codice nel metodo Up() per la migrazione iniziale.
  5. Eseguire il comando update-database per applicare la migrazione iniziale al database. Questo non apporta alcuna modifica agli oggetti esistenti (perché il metodo Up() non contiene codice), ma contrassegna il database esistente come migrato allo stato iniziale.
  6. Apporta le modifiche al tuo modello code-first.
  7. Eseguire il comando add-migration per creare una nuova migrazione. Il codice nel metodo Up() della nuova migrazione conterrà solo le modifiche al modello a oggetti.
  8. Eseguire il comando update-database per applicare le modifiche al database.
+0

Se faccio cadere il tavolo ne avrò bisogno in futuro o verrà ricreato di nuovo? –

+0

La tabella "__MigrationHistory" viene ricreata automaticamente da EF quando si esegue il comando "aggiungi-migrazione". – MrUpsideDown

+0

Anch'io ho riscontrato che Visual Studio ottiene il suo tracciamento delle modifiche del modello danneggiato in alcuni casi (ad esempio, molti cambiamenti di modello e migrazione durante il refactoring per la soluzione migliore) e l'unico modo per risolverlo è eliminare la tabella migrationhistory o eseguire manualmente il rollback delle modifiche e elimina le migrazioni bloccate dalla tabella della migrazione. Trovo che questo rilevamento del modello EF sia davvero fastidioso a volte. Laravel ha migrazioni, ma nessun modello di monitoraggio, e funziona bene. Immagino, questo è il prezzo per il tracciamento del modello - complessità e problemi aggiuntivi quando si vuole combattere contro il tracciamento automatico EF. – JustAMartin

0

Cercando di migrazione di una vecchia versione db a un nuovo modello, sia il database non corrisponde al nuovo modello o ho ottenuto errori come:

Type is not resolved for member 'Npgsql.PostgresException,Npgsql, Version=3.2.2.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7'

Ecco come funzionava (usando migrazione automatica) :

  1. Elimina cartella migrazioni
  2. Eseguire enable-migrazioni
  3. Set queste due proprietà su true nel recente creazione Configuration.cs

    public Configuration() 
    { 
        AutomaticMigrationsEnabled = true; 
        AutomaticMigrationDataLossAllowed = true; 
    } 
    
  4. Execute Update-Database -Force

Il database sarà aggiornato al più recente schema e pronto.

spero che questo aiuti.

Problemi correlati