wake-up-neo.com

Das Modell, das den Kontext 'ApplicationDbContext' unterstützt, hat sich seit der Erstellung der Datenbank geändert

Zuerst habe ich diesen Fehler nirgendwo anders gesehen und ich denke, es ist keine Wiederholung, also lest bitte zuerst die ganze Situation.

Alles hat gut funktioniert, dann habe ich versucht, Update einer meiner Modellklassen (die App-Klasse und das Update wird jetzt kommentiert gelassen). Ich werde unten aufführen und bumm, ich hatte so hässlich Error. 


Das Modell, das den Kontext 'ApplicationDbContext' unterstützt, hat sich seit der Erstellung der Datenbank geändert. Erwägen Sie die Verwendung von Code First Migrations zum Aktualisieren der Datenbank ( http://go.Microsoft.com/fwlink/?LinkId=238269 ). at System.Data.Entity.CreateDatabaseIfNotExists1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e () at System.Data.Entity.Internal.InternalContext.PerformInitializationAction (Aktionsaktion) bei System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialation () bei System.Data.at .LazyInternalContext.b__4 (InternalContext c) unter System.Data.Entity.Internal.RetryAction1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 (Aktion)) unter System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () unter System.Data.Entity.Intntra.Intern.IntetContent.AdriptContact.AntachedataOptArmadontachArrnotation. at System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.Include (String path) unter System.Data.Entity.Infrastructure.DbQuery1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable1 source, String path) at System.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable1 source, Expression1 path) at Microsoft.AspNet.Identity.EntityFramework.UserStore6.GetUserAggregateAsync(Expression1 (filter) bei Microsoft.AspNet.Identity.EntityFramework.UserStore6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager2.FindByNameAsync (String userName) bei Microsoft.AspNet.Identity.UserM anager`2.d__12.MoveNext () --- Ende des Stack-Trace vom vorherigen Speicherort, an dem eine Ausnahme ausgelöst wurde --- unter System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) unter System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) unter ControlPanel.Web.Controllers.AccountController.d__2.MoveNext () in d:\Projects\FULL\Control Panel\ControlPanel.Web\Controllers\AccountController.cs: Zeile 56

Zuerst Ich dachte, es könnte sich um ein Migrationsproblem handeln, also habe ich die Datenbank komplett gelöscht, die Migrationen wieder aktiviert, eine Init-Migration hinzugefügt und die Datenbank mit aktualisiert 

update-database -force -verbose

Alles geht gut, es gibt keine Beschwerden, aber wenn ich versuche, mich auf meiner Website anzumelden, bekomme ich den vorherigen Fehler. Ich habe die Migration ungefähr zehn Mal gemacht, ohne das Problem lösen zu können.

Hier sind meine Domain-Klassen (Modelle):

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; }
}

Hier sind meine 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");
    }
}
80
a7madx7

Es war so ein seltsamer Fehler. Es war nicht mein Fehler am Ende, es war von Microsoft. Ich installierte das Entity Framework mit der "Pre-Release" -Version und war für diesen Fehler verantwortlich, als ich zum Stall aufrief Danke, jeder glaubt mir, als ich diese Frage stellte, die ich ungefähr eine Woche lang nach seiner Lösung gesucht habe. Ich bin mir ziemlich sicher, dass dieses Problem nicht irgendwo anders ist: die Version von entity framework.dll, die die Problem war 6.0.2, wenn es hilft.

11
a7madx7

Nur für den Fall, dass jemand anderes über dieses Problem stolpert, das eine Datenbankimplementierung wie ich durchführte.

Ich habe eine Änderung vorgenommen, indem ich die ApplicationUser-Klasse erweitert, der AspNetUsers-Tabelle ein neues Feld hinzugefügt habe, und hatte beim Start dann diesen Fehler.

Ich konnte dieses Problem beheben, indem der in der __MigrationHistory-Tabelle erstellte Datensatz gelöscht wurde (dort war nur ein Datensatz). Ich gehe davon aus, dass EF entschieden hat, dass ich meine Datenbank mithilfe des Migrationstools aktualisieren muss. Dies hatte ich jedoch bereits manuell getan.

130
Josh

Das hat für mich funktioniert - keine weiteren Änderungen nötig.

DELETE FROM [dbo].[__MigrationHistory]
67
Daniel de Zwaan

Dies post hat mein Problem behoben. Es geht darum, die folgende Zeile in Application_Start() in Global.asax Einzufügen:

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

Es verursacht jedoch eine Neuerstellung der Datenbank für jede Bearbeitung in Ihrem Modell, und Sie können Ihre Daten verlieren.

34
Amin Saqi

Jeder bekommt von diesem Fehler Kopfschmerzen: Stellen Sie absolut sicher, dass alle Ihre Projekte einen Verweis auf dieselbe Entity Framework Assembly haben.

Kurzgeschichte lang:

Mein Modell und meine Anwendung befanden sich in verschiedenen Baugruppen. Diese Assemblys verweisen auf eine andere Version von Entity Framework. Ich vermute, dass die beiden Versionen eine unterschiedliche ID für dasselbe Modell generierten. Wenn also meine Anwendung ausgeführt wurde, stimmte die ID des Modells nicht mit der neuesten Migration in __MigrationHistory überein. Nachdem alle Verweise auf die neueste EF-Version aktualisiert wurden, wurde der Fehler nicht mehr angezeigt.

11
Hari

Wenn Sie die Tabelle "[__MigrationHistory]" aus Ihrer "Datenbank> Systemtabellen" löschen, funktioniert sie.

9
Aniket Sharma

Ich habe viele Tage damit verbracht, dieses Problem zu lösen, habe viele verschiedene Beiträge analysiert und viele Optionen ausprobiert und endlich behoben. Diese 2 Projekte in meiner Lösung mit EF-Code-Erstmigrationen:

  • Konsolenanwendung "DataModel", die hauptsächlich als Assembly verwendet wird und alle meine ersten Entitäten, DbContext, Mirgations und generisches Repository enthält. Ich habe diesem Projekt eine separate leere lokale Datenbankdatei (im Ordner DataModel/App_Data) hinzugefügt, um Migrationen von der Package Manager Console aus generieren zu können. 
  • WebApi, der auf das DataModel-Projekt verweist und eine lokale Datenbankdatei aus dem WebApi/App_Data-Ordner verwendet, der nicht im Projekt enthalten ist

Ich habe diese Fehlermeldung erhalten, als WebApi angefordert wurde ...

Meine Umgebung:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional mit Update 1
  • alle meine Projekte für .NET Framework 4.6.1
  • EntityFramework 6.1.3 von NuGet

Hier habe ich alle Anmerkungen gesammelt, die Sie beachten sollten, und alle Bedingungen/Anforderungen, die erfüllt sein müssen, um die erwähnte Ausnahme zu vermeiden:

  1. Sie sollten nur eine Version des EntityFramework Nuget-Pakets für alle Projekte in Ihrer Lösung verwenden.
  2. Datenbank, die durch sequentielles Ausführen aller Migrationsskripts erstellt wird, sollte die gleiche Struktur/das gleiche Schema wie die Zieldatenbank haben und dem Entitätsmodell entsprechen. Die folgenden drei Dinge müssen genau übereinstimmen/reflektieren/übereinstimmen:
    • Ihr bisheriges Migrationsskript bis zum Schluss
    • Zustand des ersten Modells des ersten Entitätsmodells (DbContext, Entitäten)
    • Zieldatenbank
  3. Die Zieldatenbank (MDF-Datei) sollte bis zum letzten Migrationsskript aktualisiert werden. Stellen Sie sicher, dass die Tabelle "__MigrationHistory" in Ihrer Zieldatenbank Datensätze für alle vorhandenen Migrationsskripts enthält. Dies bedeutet, dass alle Migrationsskripts erfolgreich auf diese Datenbank angewendet wurden. Ich empfehle Ihnen, Visual Studio zu verwenden, um die ersten Entitäten und den Kontext, die Ihrer Datenbank entsprechen, zu generieren. Projekt -> Neues Element hinzufügen -> ADO.NET-Entitätsdatenmodell -> Code Zuerst aus der Datenbank:   Als Alternative können Sie, wenn Sie keine Datenbank haben, manuell Modell schreiben (Code First Entities und Kontext) und dann die erste Migration und Datenbank generieren. 
  4. Name der Verbindungszeichenfolge, z. MyConnectionString in der Konfigurationsdatei des Startprojekts (Web.config/App.config):

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

    sollte gleich dem Parameter sein, der im Konstruktor Ihres DbContext übergeben wurde:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. Stellen Sie vor der Verwendung von Package Manager Console sicher, dass Sie die richtige Datenbank für die Aktualisierung oder für die Generierung der Migration verwenden und das erforderliche Projekt als Startprojekt der Lösung festgelegt ist. Für die Verbindung zur Datenbank wird eine Verbindungszeichenfolge aus dieser .config-Datei verwendet, die in project als Startprojekt festgelegt ist. 
  6. Und das Hauptproblem, das mein Problem behoben hat: Es ist komisch, aber in meinem WebApi/bin-Ordner war DataModel.exe alt und wurde seit dem letzten Build nicht aktualisiert. Da Migrationen in meine Assembly DataModel.exe eingebettet waren, hat mein WebApi die Datenbank unter Verwendung alter Spiegelungen aktualisiert. Ich war verwirrt, warum die Aktualisierung der Datenbank in WebApi nicht dem neuesten Migrationsskript von DataModel entspricht. Folgender Code erstellt (falls nicht vorhanden) oder aktualisiert automatisch die letzte lokale Migrationsdatenbank in meinem WebApi/App_Data-Ordner. 

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...
    

    Ich habe versucht, die Lösung zu rekonstruieren und neu aufzubauen, aber es half nicht, als ich die Ordner Bin und obj vollständig aus WebApi entfernte, Datenbankdateien aus WebApi/App_Data löschte, erstellte, neu startete WebApi Initialisierung (mit Zeilen oben), die der letzten Migration entspricht, und Ausnahme erschien nicht mehr .Dies kann das Problem beheben:

    1. Entfernen Sie die Ordner bin, obj manuell aus Ihrem Startprojekt (wodurch Ihre Datenbank generiert/aktualisiert wird).
    2. bauen Sie Ihr Startprojekt auf oder bereinigen Sie Ihre gesamte Lösung.
    3. erstellen Sie die Datenbank neu, indem Sie das Projekt starten (führt die obigen Zeilen aus) oder verwenden Sie den Befehl "update-database" der Package Manager Console. 
    4. Überprüfen Sie manuell, ob die generierte Datenbank und __MirgationHistory dem neuesten Migrationsskript entsprechen.
7
Sergey Kulgan

Dies kann vorkommen, wenn Sie die Datenanmerkungen einer Modelleigenschaft ändern. Beispiel: Das Hinzufügen von [Required] zu einer Eigenschaft bewirkt eine ausstehende Änderung im Datenbankdesign.

Die sicherste Lösung ist, auf der Package Manager Console auszuführen:

add-migration myMirgrationName

dadurch werden die genauen Änderungen in der Up () -Methode angezeigt. Daher können Sie entscheiden, ob Sie solche Änderungen wirklich anwenden möchten:

update-database

Andernfalls löschen Sie einfach die letzte Migration aus der Tabelle __MigrationHistory und aus dem Migrationsordner den Projektmappen-Explorer.

2
Mohamed Nagieb

Ich hatte das gleiche Problem wie a7madx7, aber mit der stabilen Version von EF (v6.1.1) und fand die Lösung in:

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

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

Der zweite Link enthält eine spezielle Erwähnung für VB ..... "Sie können einfach alle Datenbasiskontexte, bei denen dieses Problem auftritt, zu Ihrer app_start-Methode in der Datei global.asax hinzufügen." :

Database.SetInitializer(Of DatabaseContext)(Nothing)

NB: Ich musste "DatabaseContext" durch den Namen meiner Klasse ersetzen, die DbContext implementiert

Update: Wenn Sie die Codefirst-Methode zum Herstellen einer Verbindung zu vorhandenen Tabellen verwenden, überprüfen Sie die Datenbank, um festzustellen, ob EF eine Tabelle "_migrationhistory" zum Speichern von Zuordnungen erstellt hat. Ich benannte diese Tabelle um und konnte dann SetInitializer aus global.asax entfernen.

2
user3085342

Ich löste gerade ein ähnliches Problem, indem ich alle Dateien im Websiteordner löschte und dann erneut veröffentlichte.

1
Daniel Björk

Klicken Sie im Menü Extras auf NuGet Package Manager und dann auf Package Manager Console (PMC). Geben Sie die folgenden Befehle in die PMC ein.

Enable-Migrations Add-Migration InitUpdate-DatabaseRun die Anwendung ausführen . Die Lösung des Problems ist hier

1
Sultan

alle Tabellenidentitäten entfernen

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser
1
Majid joghataey

Unten war die ähnliche Art von Fehler, auf die ich gestoßen bin

Das Modell, das den Kontext 'PsnlContext' unterstützt, hat sich seit der Erstellung der Datenbank geändert. Erwägen Sie die Verwendung von Code First Migrations zum Aktualisieren der Datenbank ( http://go.Microsoft.com/fwlink/?LinkId=238269 ).

Ich habe den folgenden Abschnitt im Application Start-Ereignis von Global.asax hinzugefügt, um den Fehler zu beheben

Database.SetInitializer (Null);

Das Problem wurde behoben

0
Lati

Bei der Entwicklung ziehe ich es vor, diese praktische Klasse zum Konfigurieren von Migrationen zu verwenden.

Ich hoffe es hilft.

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
Andre Mesquita

der Fehler bedeutet einfach, dass Ihre Modelle geändert wurden und sich nicht in Synchronisierung mit der DB befinden. Gehen Sie zur Paket-Manager-Konsole add-migration foo2 Dadurch erhalten Sie einen Hinweis auf die Ursache des Problems Möglicherweise haben Sie etwas entfernt, oder in meinem Fall entferne ich eine Datenanmerkung . Dort können Sie die Änderung erhalten und sie hoffentlich in Ihrem Modell rückgängig machen.

danach foo2 löschen.

0
Yusufm.Salh

Das Löschen von Zeilen in der Tabelle [__MigrationHistory] mit älterer Produktversion funktionierte für mich. Diese Antwort ist für diejenigen gedacht, die nicht die gesamte Tabelle [__MigrationHistory] löschen möchten. Löschen Sie einfach die Zeilen mit älterer Version in ProductVersion Column. Hoffe es hilft jemandem!

0
Rajon Tanducar

Löschen Sie einfach das Migrationsprotokoll in _MigrationHistory in Ihrer Datenbank. Es hat für mich funktioniert

0
k.demas