2015-06-11 11 views
7

versione corta:Come ripristinare completamente la cronologia di migrazione di Entity Framework 6? (migrazioni Zombie!)

Dopo aver eliminato l'intero database (tra cui __MigrationHistory) e tutte le migrazioni nella soluzione ... in qualche modo, le migrazioni di nome sono stati trovati da qualche parte e applicato da DbMigrator! Da dove vengono???

Versione lunga:

Stiamo utilizzando Entity Framework 6, contro SQL Server 2012. Si tratta di una webapp MVC, e che stiamo usando le migrazioni basati su codice, e abbiamo una moderatamente lunga storia di migrazioni a questo punto. Noi eseguire migrazioni all'avvio:

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     ... 

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

su diversi PC si sta lavorando bene, ma su un solo nuova PC, ho dei problemi in cui sembra fuori sincrono in qualche modo. Ogni volta che viene eseguita l'app, si lamenta che ci sono modifiche in sospeso.

System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException occurred 
HResult=-2146233088 
Message=Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration. 
Source=EntityFramework 
StackTrace: 
    at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) 
    at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) 
    at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b() 
    at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
    at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update() 
    at CVInsights.MvcApplication.Application_Start() in c:\Work\ClearVision\CVO\CVInsights\Global.asax.cs:line 20 
InnerException: 

Ma l'esecuzione di add-migration non mostra modifiche e il database di aggiornamento non fa nulla.

Quindi, rinunciando al momento, ho voluto "resettare" completamente le migrazioni EF. Così ho cancellato l'intero database (ovviamente includendo la tabella __MigrationHistory). E ho cancellato tutte le migrazioni dalla cartella Migrazioni IDE.

Ora ... quando avvio la nostra app su questo nuovo PC ... il DbMigrator trova ancora e applica una serie di migrazioni denominate da qualche parte! Non è la lista completa che abbiamo attualmente (nel nostro controllo sorgente), ma è l'elenco fino a un certo punto alcune settimane fa. Dopo l'applicazione di alcune di queste "migrazioni zombie", getta la solita eccezione "

Dove diavolo sono essi provengono da ??

mi sento come se devo fare qualcosa di molto stupido, o il PC è fondamentalmente incasinato ...

Configuration.cs:.

public sealed class Configuration : DbMigrationsConfiguration<CloudDatabase.DAL.DatabaseContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(CloudDatabase.DAL.DatabaseContext context) 
    {    

     context.Roles.AddOrUpdate(role => role.ID, // This is the primary key or the table we are adding to or updating. 
      new Role() { ID = 1, Name = "A role" }, 
      new Role() { ID = 2, Name = "another role" }, 
      new Role() { ID = 3, Name = "third role" } 
     ); 
    } 
} 
+0

Sei sicuro di aver cancellato tutte le migrazioni (forse alcune sono in una cartella diversa)? Mi sembra che stia applicando parte delle migrazioni, quindi proviamo ad applicare il resto delle modifiche nel tuo contesto come una migrazione automatica. Avete un database "di base" o le vostre migrazioni sono progettate per iniziare con un database vuoto? – vesan

+0

Ciao Vesan. Penso * Ho eliminato tutte le migrazioni. Ho cancellato tutti i file datetime_name.cs nella cartella Migrations. Non ci sono sottocartelle. C'è ancora un configuration.cs con poco in esso. Le migrazioni iniziano con un database vuoto - come ho detto, ho cancellato l'intero database per iniziare. Le migrazioni automatiche sono disattivate. (AutomaticMigrationsEnabled = false; in configuration.cs) –

+0

Hmm sembra che tu abbia coperto praticamente tutto. Hai controllato la dll effettiva che è in esecuzione con ildasm/reflector per assicurarti che sia quella giusta e non una vecchia build o qualcosa del genere? Forse puoi anche provare la registrazione della migrazione se non ti dice qualcosa di utile (vedi [qui] (http://stackoverflow.com/questions/24357963)). Altrimenti non ho più idee. Spero che qualcuno sarà in grado di aiutare. – vesan

risposta

5

sulla base della catena di commenti e che cosa ti sembra di aver provato, vorrei suggerire la seguente linea di condotta si prega di notare io parto dal presupposto di avere un archivio di codice di qualche forma (se non si prega di bac kup il tuo codice).

  1. Eliminare il database in questione.
  2. Chiudere tutte le copie di Visual Studio.
  3. Elimina l'origine dalla cartella della soluzione (tutto, non lasciare nulla dietro).
  4. estrarre una copia del codice dal vostro negozio di codice (tirare, Get ecc)
  5. ricostruire la soluzione
  6. Eseguire il comando update-database ed eseguire il progetto.

Se ciò non risolve il progetto, la mia ipotesi potrebbe essere un problema con l'installazione di Visual Studio (reinstallare, spero di no).

Buona fortuna.

+1

Questo sembra aver risolto il problema. La cronologia delle migrazioni è "da qualche parte" nelle mie cartelle di lavoro, ma non so dove. Molte grazie! –

+0

La chiusura e la riapertura lo hanno fatto per me. – AGoodDisplayName

+0

Confermato, questo ha risolto lo stesso problema che stavo ottenendo. – Ellis

Problemi correlati