Il modello che supporta il contesto ‘ApplicationDbContext’ è cambiato da quando è stato creato il database

Prima di tutto non ho visto questo errore da nessun’altra parte e immagino che non sia una replica quindi per favore leggi prima l’intera situazione.

Ogni cosa funzionava bene, quindi ho provato ad aggiornare una delle mie classi di modelli (la class App e l’aggiornamento è ora lasciato commentato) che elencerò di seguito e boom ho avuto questo brutto errore.


Il modello che supporta il contesto ‘ApplicationDbContext’ è cambiato da quando è stato creato il database. Prendi in considerazione l’utilizzo di Code First Migrations per aggiornare il database ( http://go.microsoft.com/fwlink/?LinkId=238269 ). su System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.c__DisplayClassf 1.b__e () su System.Data.Entity.Internal.InternalContext.PerformInitializationAction (Azione azione) su System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization () su System.Data.Entity.Internal.LazyInternalContext.b__4 (InternalContext c) su System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action 1) su System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () su System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType (Type entityType) su System.Data.Entity .Internal.Linq.InternalSet 1. 1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet 1.Include (percorso String) su System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable 1 sorgente, percorso stringa) a System.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable 1 source, Expression 1 path) in Microsoft.AspNet.Identity.EntityFramework.UserStore 6.GetUserAggregateAsync(Expression 1 filter) in Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager 2.FindByNameAsync (String userName) in Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext () — Fine dello stack trace dalla posizione precedente in cui è stata generata un’eccezione — su System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task dell’attività) su System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task dell’attività) su ControlPanel.Web.Controllers.AccountController .d__2.MoveNext () in d: \ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs: riga 56

All’inizio pensavo che potesse essere un problema di migrazione, quindi ho abbandonato completamente il database, ritriggersto le migrazioni e aggiunto una migrazione Init e aggiornato il database utilizzando

 update-database -force -verbose 

Ogni cosa va bene, nessuna lamencanvas, tuttavia ogni volta che provo ad accedere al mio sito ottengo l’errore precedente. Ho fatto la migrazione circa dieci volte senza essere in grado di risolvere il problema.

Ecco le mie classi di dominio (modelli):

 public class App { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public virtual int AppId { get; set; } //[Required] public virtual string FacebookId { get; set; } //[Required] public virtual string Secret { get; set; } public virtual List Users { get; set; } public virtual List Posts { get; set; } //public virtual ApplicationUser Admin { get; set; } } public class Post { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public virtual int PostId { get; set; } public virtual string Content { get; set; } public virtual string Link { get; set; } public virtual string Image { get; set; } public virtual bool IsSpecial { get; set; } //[Required] public virtual App App { get; set; } //[Required] public virtual DateTime? PublishDate { get; set; } } public class User { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public virtual int UserId { get; set; } [MaxLength(500)] public virtual string FacebookId { get; set; } [MaxLength(500)] public virtual string Token { get; set; } //[Required] public virtual App App { get; set; } } 

Ecco i miei IdentityModels:

 public class ApplicationUser : IdentityUser { public virtual List Apps { get; set; } public bool? IsPremium { get; set; } [DataType(DataType.Date)] public DateTime? LastPublishDateTime { get; set; } } public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext() : base("dCon") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().ToTable("Admins"); modelBuilder.Entity().ToTable("Admins"); modelBuilder.Entity().ToTable("AdminRoles"); modelBuilder.Entity().ToTable("Logins"); modelBuilder.Entity().ToTable("Claims"); modelBuilder.Entity().ToTable("Roles"); } } 

Nel caso in cui qualcun altro si imbatta in ciò che stava facendo una prima implementazione del database come me.

Ho apportato una modifica estendendo la class ApplicationUser , aggiungendo un nuovo campo alla tabella AspNetUsers e quindi visualizzato questo errore all’avvio.

Sono stato in grado di risolvere questo eliminando il record creato nella tabella __MigrationHistory (c’era solo un record). Suppongo che EF abbia deciso di aggiornare il mio database usando lo strumento di migrazione – ma l’avevo già fatto manualmente io stesso.

Questo ha funzionato per me – non sono necessarie altre modifiche.

 DELETE FROM [dbo].[__MigrationHistory] 

Questo post ha risolto il mio problema. Si tratta di aggiungere la seguente riga in Application_Start() in Global.asax :

Database.SetInitializer(null);

Tuttavia, causa la ricreazione del database per ogni modifica nel modello e potresti perdere i tuoi dati.

Tutti hanno mal di testa da questo errore: assicurati che tutti i tuoi progetti abbiano un riferimento allo stesso assembly Entity Framework.

Breve storia lunga:

Il mio modello e la mia applicazione erano in diversi gruppi. Questi assembly facevano riferimento a una versione diversa del framework Entity. Immagino che le due versioni abbiano generato un ID diverso per lo stesso modello. Quindi, quando la mia applicazione eseguiva l’id del modello non corrispondeva a quella dell’ultima migrazione in __MigrationHistory. Dopo aver aggiornato tutti i riferimenti all’ultima release EF, l’errore non si è più manifestato.

E ‘stato un errore così strano, non è stato il mio errore alla fine, è stato Microsoft, ho installato il framework Entity come versione “pre-release” ed è stato responsabile di questo errore, quando ho aggiornato alla stable Rilasciato scomparendo, grazie a tutti mi credete quando ho fatto questa domanda ho cercato per una settimana o giù di lì per la sua soluzione quindi sono abbastanza sicuro che questo problema non è da nessun’altra parte: la versione di entity framework.dll che ha causato il il problema era 6.0.2 se aiuta.

Se elimini la tabella “[__MigrationHistory]” dal tuo “database> Tabelle di sistema” allora funzionerà.

Ho trascorso molti giorni per risolvere questo problema, analizzato molti post diversi e provato molte opzioni e infine risolto. Questi 2 progetti nella mia soluzione utilizzano le migrazioni di primo codice EF:

  • Applicazione console “DataModel” che utilizza principalmente come assembly che contiene tutte le mie prime quadro di codice, DbContext, Mirgations e repository generico. Ho incluso in questo progetto un file di database locale vuoto separato (nella cartella DataModel / App_Data) per poter generare migrazioni dalla console di Package Manager.
  • WebApi, che fa riferimento al progetto DataModel e utilizza il file di database locale dalla cartella WebApi / App_Data, che non è incluso nel progetto

Ho ricevuto questo errore quando richiesto WebApi …

Il mio ambiente:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional con aggiornamento 1
  • tutti i miei progetti mirati per .NET Framework 4.6.1
  • EntityFramework 6.1.3 da NuGet

Qui ho raccolto tutte le osservazioni che dovresti prestare attenzione e tutte le condizioni / requisiti che devono essere soddisfatti, per evitare un’eccezione menzionata:

  1. È necessario utilizzare solo una versione del pacchetto Nuget di EntityFramework per tutti i progetti nella soluzione.
  2. Il database, creato eseguendo in sequenza tutti gli script di migrazione, dovrebbe avere la stessa struttura / schema del database di destinazione e corrispondere al modello di entity framework. Seguendo 3 cose devono esattamente corrispondere / riflettere / abbinarsi tra loro:
    • Tutto il tuo script di migrazione fino all’ultimo
    • Stato del codice della prima quadro del codice corrente (DbContext, quadro)
    • Database di destinazione
  3. Il database di destinazione (file mdf) deve essere aggiornato / corrispondere fino all’ultimo script di migrazione. Verificare che la tabella “__MigrationHistory” nel database di destinazione contenga i record per tutti gli script di migrazione in uso, significa che tutti gli script di migrazione sono stati applicati correttamente a quel database. Vi consiglio di utilizzare Visual Studio per la generazione di codice corretto per prime entity framework e contesto che corrisponde al vostro database, Progetto -> Aggiungi nuovo elemento -> ADO.NET Entity Data Model -> Code First dal database: Naturalmente, in alternativa, se non si dispone di un database, è ansible scrivere manualmente il modello (codice prima entity framework e contesto) e quindi generare la migrazione iniziale e il database.
  4. Nome della stringa di connessione es. MyConnectionString nel file di configurazione del progetto di avvio (Web.config / App.config):

          

    dovrebbe essere uguale al parametro passato nel costruttore del tuo DbContext:

      public partial class MyDbContext : DbContext { public MyDbContext() : base("name=MyConnectionString"){} ... 
  5. Prima di utilizzare la console di Package Manager , assicurarsi di utilizzare il database corretto per l’aggiornamento o generare la migrazione e il progetto necessario viene impostato come progetto di avvio della soluzione. Per la connessione al database utilizzerà la stringa di connessione da quel file .config, che nel progetto, è impostato come progetto di avvio.
  6. E il principale, che ha risolto il mio problema: è strano, ma nella mia cartella WebApi / bin DataModel.exe era vecchio, non aggiornato dall’ultima build. Poiché le migrazioni sono state incorporate nel mio assieme DataModel.exe, il mio database aggiornato di WebApi utilizzava vecchie mirazioni. Ero confuso perché dopo aver aggiornato il database in WebApi non corrisponde all’ultimo script di migrazione da DataModel. Il codice seguente crea automaticamente (se non esiste) o aggiornamenti al database locale di migrazione più recente nella mia cartella WebApi / App_Data.

      public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { Database.SetInitializer(new MigrateDatabaseToLatestVersion()); ... 

    Ho provato a pulire e ribuild la soluzione, ma non mi ha aiutato, ho rimosso completamente le cartelle bin e obj da WebApi, i file di database cancellati da WebApi / App_Data, costruito, riavviato WebApi, fatto richiesta, creato database corretto – inizializzazione pigra (usando righe sopra), che corrisponde all’ultima migrazione e l’eccezione non è stata più visualizzata. Quindi, questo potrebbe risolvere il tuo problema:

    1. rimuovere manualmente bin, cartelle obj dal progetto di avvio (che genera / aggiorna il database)
    2. crea il tuo progetto di avvio o meglio pulisci e ricostruisci tutte le soluzioni.
    3. ricreare il database avviando il progetto (eseguirà le righe sopra) o utilizzare il comando “update-database” della Console di gestione pacchetti.
    4. verificare manualmente se db e __MirgationHistory generati corrispondono all’ultimo script di migrazione.

Avevo lo stesso problema di a7madx7, ma con rilascio stabile di EF (v6.1.1), e ho trovato la risoluzione pubblicata in:

http://cybarlab.com/context-has-changed-since-the-database-was-created

con variazione in: http://patrickdesjardins.com/blog/the-model-backing-the-context-has-changed-since-the-database-was-created-ef4-3

Il secondo link include una menzione specifica per VB ….. “puoi semplicemente aggiungere tutti i database che hanno questo problema sul tuo metodo app_start nel file global.asax come questo” :

 Database.SetInitializer(Of DatabaseContext)(Nothing) 

NB: ho dovuto sostituire “DatabaseContext” con il nome della mia class implementando DbContext

Aggiornamento: Inoltre, quando si utilizza l’approccio codefirst per connettersi alle tabelle esistenti, controllare il database per vedere se EF ha creato una tabella “_migrationhistory” per memorizzare i mapping. Ho ribattezzato questa tabella quindi è stato in grado di rimuovere SetInitializer da global.asax.

Ho appena risolto un problema simile eliminando tutti i file nella cartella del sito Web e quindi ripubblicato.

rimuovere tutte le tabelle di id quadro

 Delete _MigrationHistory Delete AspNetRoles Delete AspNetUserClaims Delete AspNetUserLogins Delete AspNetRoles Delete AspNetUser 

Dal menu Strumenti, fare clic su NuGet Package Manager, quindi fare clic su Package Manager Console (PMC). Immettere i seguenti comandi nel PMC.

Enable-Migrations Add-Migration Init Update-Database Esegui l’applicazione. La soluzione al problema è da qui

Eliminare le righe nella tabella [__MigrationHistory] con la versione precedente di ProductVersion ha funzionato per me. Questa risposta è per coloro che non vogliono cancellare l’intera tabella [__MigrationHistory]. Basta eliminare le righe con la versione precedente nella colonna ProductVersion. Spero che ne aiuti qualcuno!

Questo può accadere quando si modifica l’annotazione dei dati di una proprietà del modello. ad esempio: l’aggiunta di [Required] a una proprietà causerà una modifica in sospeso nella progettazione del database.

La soluzione più sicura è quella di eseguire sulla console di Gestione pacchetti:

 add-migration myMirgrationName 

che mostrerà le esatte modifiche nel metodo Up (). Pertanto, puoi decidere se vuoi veramente applicare tali modifiche tramite:

 update-database 

In caso contrario, è ansible eliminare l’ultima migrazione dalla tabella __MigrationHistory e dalla cartella Migrations in Esplora soluzioni.

Quando sviluppo, preferisco usare questa class pratica per configurare le Migrazioni.

Spero che sia d’aiuto.

 public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { this.Configuration.LazyLoadingEnabled = false; } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove(); modelBuilder.Conventions.Remove(); Database.SetInitializer(new StackOverflowInitializer()); } public class StackOverflowInitializer : DropCreateDatabaseIfModelChanges { public StackOverflowInitializer() { // TODO NOTHING, COMMENT ALL // IF CHANGES, RECREATE Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); // CREATE ONLY NOT EXITS //Database.SetInitializer(new CreateDatabaseIfNotExists()); } } public System.Data.Entity.DbSet Companies { get; set; } } 

Aggiungi sotto la riga all’interno di “Application_Start” in “Global.asax.cs”

 Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); 

Di seguito è stato il tipo di errore simile che ho incontrato

Il modello che supporta il contesto “PsnlContext” è stato modificato da quando è stato creato il database. Prendi in considerazione l’utilizzo di Code First Migrations per aggiornare il database ( http://go.microsoft.com/fwlink/?LinkId=238269 ).

Ho aggiunto la sezione seguente nell’evento Avvio applicazione di Global.asax per risolvere l’errore

Database.SetInitializer (null);

Questo risolve il problema

Elimina il db esistente, crea un nuovo db con lo stesso nome, copia tutti i dati … funzionerà