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


85

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.

Tutto funzionava bene, quindi ho provato ad aggiornare una delle mie classi di modelli (la classe App e l'aggiornamento è ora lasciato commentato) che elencherò di seguito; e boom ho avuto questo brutto errore.


Il modello che supporta il contesto "ApplicationDbContext" è cambiato da quando è stato creato il database. Valuta la possibilità di utilizzare le migrazioni Code First per aggiornare il database ( http://go.microsoft.com/fwlink/?LinkId=238269 ). in System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e () in System.Data.Entity.Internal.InternalContext.PerformInitializationAction (azione azione) in System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization () in System.Data.Entity. Internal.LazyInternalContext.b__4 (InternalContext c) in System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 azione) in System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () in System.Data.Entity.Internal.InternalContext.GetEntitySetAndBase entityType) in System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.Include (String path) in System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable1 source, String path) in System.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable 1 source, Expression1 path) in Microsoft.AspNet.Identity. EntityFramework.UserStore 6.GetUserAggregateAsync(Expression1 filter) in Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager2.FindByNameAsync (String userName) in Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext () --- Fine traccia dello stack dalla posizione precedente in cui è stata generata un'eccezione --- in System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) in ControlPanel.Web.Controllers.AccountController.d__2.Move : \ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs: riga 56

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

update-database -force -verbose

Va tutto bene senza lamentele, tuttavia ogni volta che provo ad accedere al mio sito ricevo l'errore precedente. Ho eseguito 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<User> Users { get; set; }
    public virtual List<Post> 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<App> Apps { get; set; }
    public bool? IsPremium { get; set; }
    [DataType(DataType.Date)]
    public DateTime? LastPublishDateTime { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("dCon")
    {
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("Admins");
        modelBuilder.Entity<ApplicationUser>().ToTable("Admins");
        modelBuilder.Entity<IdentityUserRole>().ToTable("AdminRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("Logins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("Claims");
        modelBuilder.Entity<IdentityRole>().ToTable("Roles");
    }
}

Sei sicuro di non aver visto questo problema altrove? E questo collegamento? stackoverflow.com/questions/3600175/...
AndreCruz

4
No, non sono gli stessi, posso assicurarti, ho provato la soluzione fornita lì senza risultati, il loro errore dice: Elimina / aggiorna manualmente il database, mentre il mio dice: Prendi in considerazione l'utilizzo di migrazioni Code First per aggiornare il database
a7madx7

Risposte:


139

Nel caso in cui qualcun altro si imbattesse in questo che stava facendo una prima implementazione del database come me.

Ho apportato una modifica estendendo la ApplicationUserclasse, aggiungendo un nuovo campo alla AspNetUserstabella e quindi ho riscontrato questo errore all'avvio.

Sono stato in grado di risolvere questo problema eliminando il record creato nella __MigrationHistorytabella (c'era solo un record lì) Presumo che EF abbia deciso che dovevo aggiornare il mio database utilizzando lo strumento di migrazione, ma l'avevo già fatto manualmente da solo.


1
Prima anche il database e questo lo ha risolto. L'unico record era la creazione iniziale che è avvenuta prima del codice, ma l'ho modificata dopo aver utilizzato prima il database e modificato la tabella nel server MS SQL.
SolidSnake4444

Lavorato. Ho ricevuto l'errore quando ho aggiunto una vista con scaffolding. La classe del contesto dati della vista eraApplicationDbContext
Vincent Saelzler

78

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

DELETE FROM [dbo].[__MigrationHistory]

1
Ha funzionato anche per me. Soluzione molto strana. Penso che ci sia stata una migrazione interrotta nella storia. Proverò a eliminare tutte le migrazioni e a crearne di nuovo quella iniziale.
hakan

1
@ Dave Voyles puoi eseguire questo SQL direttamente in SSMS
Daniel de Zwaan

1
Ha funzionato anche per me In un database questa tabella esisteva mentre non esisteva in un altro database
Tejas

1
Le risposte di cui sopra non possono aiutarmi poiché i miei codici funzionavano correttamente fino all'ultimo aggiornamento del modello. La tua risposta ha funzionato. Ciao amico !!
Sithu

3
Questo NON ha funzionato per me e mi ha causato la necessità di eliminare il db, rieseguire le migrazioni e aggiungere nuovamente i dati. ATTENZIONE.
adamonstack

35

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

Database.SetInitializer<Models.YourDbContext>(null);

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


4
Non voglio che i miei dati vengano danneggiati o persi.
Ha detto Roohullah Allem

Non è l'approccio migliore, signore. Soluzione ma non affidabile
Ahsan Aftab

13

Se elimini la tabella "[__MigrationHistory]" dal tuo "database> Tabelle di sistema", funzionerà.


Funziona. Ma dopo aver eliminato la [__MigrationHistory] tabella, aggiorna anche il mmodel EDMX.
DmitryBoyko

12

È stato un errore così strano, non è stato un mio errore alla fine, è stato di Microsoft, ho installato il framework Entity nella versione "pre-release" ed è stato responsabile di questo errore, quando sono passato alla stabile rilasciarlo è scomparso, grazie a tutti credetemi quando ho posto questa domanda ho cercato per una settimana circa la sua soluzione quindi sono abbastanza sicuro che questo problema non sia da nessun'altra parte: la versione di entity framework.dll che ha causato il problema era 6.0.2 se aiuta.


12

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

Breve storia lunga:

Il mio modello e la mia applicazione erano in gruppi diversi. Questi assembly facevano riferimento a una versione diversa di Entity Framework. Immagino che le due versioni abbiano generato un id diverso per lo stesso modello. Quindi, quando la mia applicazione ha eseguito l'ID del modello non corrisponde a quello dell'ultima migrazione in __MigrationHistory. Dopo aver aggiornato tutti i riferimenti all'ultima versione di EF, l'errore non si è più presentato.


sì, questo era il mio caso, la maggior parte dei progetti era con ef6.1.3, mentre il progetto di test appena creato era in qualche modo con ef6.0.
ZZZ

7

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 utilizzando le prime migrazioni del codice EF:

  • Applicazione console "DataModel" che utilizza principalmente come assembly che contiene tutte le mie entità code first, 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 Gestione pacchetti.
  • 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 ho richiesto WebApi ...

Il mio ambiente:

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

Qui ho raccolto tutte le osservazioni a cui prestare attenzione e tutte le condizioni / requisiti che devono essere soddisfatti, per evitare eccezioni menzionate:

  1. È necessario utilizzare solo una versione del pacchetto EntityFramework Nuget 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 entità. Le seguenti 3 cose devono corrispondere / riflettere / abbinare esattamente:
    • Tutti i tuoi script di migrazione fino all'ultimo
    • Stato del modello della prima entità del codice corrente (DbContext, entità)
    • Database di destinazione
  3. Il database di destinazione (file mdf) deve essere aggiornato / corrispondere all'ultimo script di migrazione. Verifica che la tabella "__MigrationHistory" nel tuo database di destinazione contenga i record per tutti gli script di migrazione di cui disponi, significa che tutti gli script di migrazione sono stati applicati correttamente a quel database. Ti consiglio di utilizzare Visual Studio per la generazione di entità codice corretto first e contesto che corrisponde al tuo database, Project -> Add New Item -> ADO.NET Entity Data Model -> Code First from database: Ovviamente, in alternativa, se non si dispone di database è possibile scrivere manualmente il modello (codice prima entità e contesto) e quindi generare la migrazione iniziale e il database.
  4. Nome della stringa di connessione, ad esempio MyConnectionString nel file di configurazione del progetto di avvio (Web.config / App.config):

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>
    

    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 gestione pacchetti , assicurarsi di utilizzare il database corretto per l'aggiornamento o generare la migrazione e che il progetto necessario sia impostato come progetto di avvio della soluzione. Per connettersi 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 assembly DataModel.exe, il mio database WebApi ha aggiornato utilizzando le vecchie mirgazioni. 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 aggiorna il 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<ODS_DbContext, Configuration>()); 
               ...
    

    Ho provato a pulire e ricostruire la soluzione ma non ha aiutato, quindi ho rimosso completamente le cartelle bin e obj da WebApi, cancellato i file di database da WebApi / App_Data, costruito, riavviato WebApi, fatto richiesta ad esso, ha creato database corretto - inizializzazione pigra (usando righe sopra), che corrisponde all'ultima migrazione e l'eccezione non è apparsa più. Quindi, questo potrebbe risolvere il tuo problema:

    1. rimuovere manualmente le cartelle bin, obj dal progetto di avvio (che genera / aggiorna il database)
    2. costruisci il tuo progetto di avvio o meglio pulisci e ricostruisci tutta la tua soluzione.
    3. ricreare il database avviando il progetto (eseguirà le righe precedenti) o utilizzare il comando "update-database" della console di Gestione pacchetti.
    4. controllare manualmente se db e __MirgationHistory generati corrispondono all'ultimo script di migrazione.

3

Ciò può accadere quando si modifica l'annotazione dei dati di una proprietà del modello. ad esempio: l'aggiunta di [Obbligatorio] a una proprietà provocherà una modifica in sospeso nella struttura del database.

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

add-migration myMirgrationName

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

update-database

Altrimenti, puoi semplicemente eliminare l'ultima migrazione dalla tabella __MigrationHistory e dalla cartella Migrations il Solution Explorer.


Questa è sicuramente la migliore risposta che ho visto qui. Il suggerimento di cancellare la cronologia delle migrazioni è una pessima idea secondo me!
mgrenier

Grazie per il tuo commento. Inoltre, di solito non consiglio di eliminare la cronologia della migrazione, ma in un caso particolare, il punto di migrazione precedente non era troppo diverso - cioè non erano state apportate molte modifiche al modello dall'OP -, quindi ho pensato che potrebbe essere utile un singolo passo indietro , eliminando solo gli ultimi record di migrazione.
Mohamed Nagieb

2

Avevo lo stesso problema di a7madx7, ma con la versione 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 collegamento include una menzione specifica per VB ..... "puoi semplicemente aggiungere tutti i databasecontext che hanno questo problema sul tuo metodo app_start nel file global.asax in questo modo" :

Database.SetInitializer(Of DatabaseContext)(Nothing)

NB: ho dovuto sostituire "DatabaseContext" con il nome della mia classe che implementava DbContext

Aggiornamento: Inoltre, quando si utilizza l'approccio codefirst per connettersi a tabelle esistenti, controllare il database per vedere se EF ha creato una tabella "_migrationhistory" per memorizzare i mapping. Ho rinominato questa tabella, quindi sono stato in grado di rimuovere SetInitializer da global.asax.


2

Elimina semplicemente la cronologia della migrazione in _MigrationHistory nel tuo database. Ha funzionato per me


1

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


1

rimuovere tutte le identità delle tabelle

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

1

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

Enable-Migrations Add-Migration Init Update-Database Eseguire l'applicazione. La soluzione al problema viene da qui


1

Quando sto sviluppando, preferisco usare questa lezione pratica per configurare le migrazioni.

Spero che sia d'aiuto.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    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<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        Database.SetInitializer(new StackOverflowInitializer());
    }

    public class StackOverflowInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
    {
        public StackOverflowInitializer()
        {
            // TODO NOTHING, COMMENT ALL

            // IF CHANGES, RECREATE
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ApplicationDbContext>());

            // CREATE ONLY NOT EXITS
            //Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<ApplicationDbContext>());
        }

    }

    public System.Data.Entity.DbSet<stackoverflow.Models.Company> Companies { get; set; }

}

0

L'eliminazione di righe nella tabella [__MigrationHistory] con la versione precedente del prodotto ha funzionato per me. Questa risposta è per coloro che non vogliono eliminare l'intera tabella [__MigrationHistory]. Basta eliminare le righe con la versione precedente nella colonna ProductVersion. Spero che aiuti qualcuno!


0

Di seguito è stato riportato il tipo di errore simile che ho riscontrato

Il modello che supporta il contesto "PsnlContext" è cambiato da quando è stato creato il database. Valuta la possibilità di utilizzare le migrazioni Code First 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 ha risolto il problema


0

semplicemente l'errore significa che i tuoi modelli hanno modifiche e non sono sincronizzati con DB, quindi vai alla console del gestore pacchetti, add-migration foo2 questo darà un suggerimento su cosa sta causando il problema, potresti aver rimosso qualcosa o nel mio caso rimuovo un'annotazione di dati . da lì puoi ottenere la modifica e, si spera, invertirla nel tuo modello.

dopodiché elimina foo2.


0

So di essere in ritardo, ma voglio dare anche un contributo. Questo errore è davvero strano, perché il browser non è in grado di capire come dovrebbero essere visualizzate le modifiche perché le classi e le loro proprietà potrebbero essere cambiate ma non salvate nel database.

Quindi fai una cosa

creare una migrazione nella console di Gestione pacchetti (Strumenti> Gestione pacchetti NuGet> Console di Gestione pacchetti) utilizzando questo comando:

add-migration UpdateMigration

dove UpdateMigration è il nome della tua migrazione. Puoi dargli un nome a tua scelta, ma per favore sii specifico.

Dopodiché, dobbiamo solo aggiornare il database, quindi esegui questo:

aggiornare il database

Ora che hai salvato le modifiche nel database, aggiorna il browser e il gioco è fatto!

Spero che sia di aiuto.


0

questo accade perché aggiungi una proprietà a uno dei tuoi modelli e non l'hai fatto update-Database. per risolvere questo problema devi rimuoverlo dal modello o devi farlo add-migration anyProperName con quelle proprietà e Update-database.


0

Questo errore si è verificato quando ho apportato modifiche al mio modello e non ho effettuato la migrazione per le modifiche per aggiornare il database.

Se hai mai apportato modifiche al tuo modello nello schema di migrazione Code First

Non dimenticare di aggiungere la migrazione

add-migration UpdatesToModelProperites 

Il comando precedente leggerà tutte le modifiche apportate al modello e le scriverà nei metodi Up () e Down ().

Quindi aggiorna semplicemente il tuo database utilizzando il comando seguente.

update-database

Questo ha funzionato per me.


-2

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.