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



6 Answers

Dies funktionierte für mich - keine weiteren Änderungen erforderlich.

DELETE FROM [dbo].[__MigrationHistory]
Question

Zuallererst habe ich diesen Fehler nirgendwo anders gesehen und ich denke, es ist kein Replikat, also lies bitte zuerst die ganze Situation

Alles funktionierte gut, dann habe ich versucht, eine meiner Modellklassen zu aktualisieren (die App-Klasse und das Update ist jetzt kommentiert), die ich unten auflisten werde und Boom hatte ich diesen hässlichen Fehler.

Das Modell, das den 'ApplicationDbContext'-Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert. Erwägen Sie, Code First Migrations zu verwenden, um die Datenbank zu aktualisieren ( http://go.microsoft.com/fwlink/?LinkId=238269 ). bei System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf 1.b_e () bei System.Data.Entity.Internal.InternalContext.PerformInitializationAction (Aktion Aktion ) bei System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization () bei System.Data.Entity.Internal.LazyInternalContext.b _4 (InternalContext c) bei System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action 1-Aktion) bei System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () bei System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType (Type entityType) bei System.Data .Entity.Internal.Linq.InternalSet 1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet 1.Include (String-Pfad) bei System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable 1 Quelle, String-Pfad) bei System.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable 1 source, Expression 1 Pfad) bei Microsoft.AspNet.Identity.EntityFramework.UserStore 6.GetUserAggregateAsync(Expression 1 Filter) um Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager 2.FindByNameAsync (String userName) unter Microsoft.AspNet.Identity.UserManager`2.d_ 12.MoveNext () - - Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde - bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task-Task) unter System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task-Task) bei ControlPanel.Web.Controllers. AccountController.d _2.MoveNext () in d: \ Projekte \ FULL \ Systemsteuerung \ ControlPanel.Web \ Controllers \ AccountController.cs: Zeile 56

Zuerst dachte ich, es könnte ein Migrationsproblem sein, 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

Jede Sache geht gut, keine Beschwerden, aber wenn ich versuche, mich auf meiner Website einloggen, bekomme ich den vorherigen Fehler, ich habe die Migration Sache etwa zehn Mal, ohne in der Lage, das Problem zu lösen ..

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



Entferne alle Tabellenidentitäten

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



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

post

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

2. Link enthält spezielle Erwähnung für VB ..... "Sie können einfach alle Datenbankkontexte, die dieses Problem haben, in Ihrer app_start-Methode in der Datei global.asax wie folgt hinzufügen : "

Database.SetInitializer(Of DatabaseContext)(Nothing)

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

Update: Wenn Sie den Code-First-Ansatz verwenden, um eine Verbindung zu vorhandenen Tabellen herzustellen, überprüfen Sie die Datenbank, um festzustellen, ob EF eine Tabelle "_migrationhistory" zum Speichern von Zuordnungen erstellt hat. Ich habe diese Tabelle umbenannt und konnte SetInitializer aus global.asax entfernen.




Wenn ich mich entwickle, bevorzuge ich diese praktische Klasse, um Migrationen zu konfigurieren.

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 Initializer());
    }

    public class Initializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
    {
        public Initializer()
        {
            // 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<.Models.Company> Companies { get; set; }

}



Ich habe viele Tage damit verbracht, dieses Problem zu lösen, habe viele verschiedene Beiträge analysiert und viele Optionen ausprobiert und schließlich behoben. Diese 2 Projekte in meiner Lösung verwenden die ersten Migrationen des EF-Codes:

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

Ich habe diesen Fehler erhalten, wenn WebApi angefordert wurde ...

Meine Umgebung:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional mit Update 1
  • Alle meine Projekte sind auf .NET Framework 4.6.1 ausgerichtet
  • EntityFramework 6.1.3 von NuGet

Hier sammelte ich alle Bemerkungen, 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 sequenzielles Ausführen aller Migrationsskripts erstellt wird, sollte dieselbe Struktur / dasselbe Schema wie die Zieldatenbank haben und dem Entitätsmodell entsprechen. Folgende 3 Dinge müssen genau entsprechen / reflektieren / übereinstimmen:
    • Dein ganzes Migrationsskript bis zuletzt
    • Aktueller Code erster Entity-Modellstatus (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 für die Generierung von korrekten ersten Code-Entitäten und Kontext zu verwenden, der Ihrer Datenbank Projekt -> Neues Element hinzufügen -> ADO.NET-Entitätsdatenmodell -> Code zuerst aus der Datenbank entspricht: Wenn Sie keine Datenbank haben, können Sie alternativ auch manuell ein Modell schreiben (erste Entitäten und Kontext kodieren) und dann eine anfängliche Migration und Datenbank generieren.
  4. Name der Verbindungszeichenfolge zB MyConnectionString in der Konfigurationsdatei des Startprojekts (Web.config / App.config):

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

    sollte dem im Konstruktor Ihres DbContext übergebenen Parameter entsprechen:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. Stellen Sie vor der Verwendung der Package Manager Console sicher, dass Sie die richtige Datenbank für die Aktualisierung verwenden oder die Migration generieren, und dass das erforderliche Projekt als Startprojekt der Lösung festgelegt wird. Für die Verbindung zur Datenbank wird die Verbindungszeichenfolge aus dieser .config-Datei verwendet, die im Projekt als Startprojekt festgelegt ist.
  6. Und das Main, das mein Problem behoben: Es ist seltsam, aber in meinem WebApi / bin-Ordner DataModel.exe war alt, nicht aktualisiert seit dem letzten Build. Da Migrationen in meine Assembly DataModel.exe eingebettet wurden, wurde meine WebApi-Datenbank mit alten Migrationen aktualisiert. Ich war verwirrt, warum nach dem Aktualisieren der Datenbank in WebApi nicht das neueste Migrationsskript von DataModel entspricht. Der folgende Code erstellt automatisch (wenn nicht vorhanden) oder aktualisiert die neueste lokale Migration-Datenbank 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, sauber und Wiederaufbau Lösung, aber es hat nicht geholfen, als ich vollständig entfernt bin und obj Ordner von WebApi, gelöschte Datenbankdateien von WebApi / App_Data, gebaut, neu gestartet WebApi, stellte es, es erstellt korrekte Datenbank - faul Initialisierung (mit Zeilen oben), was der letzten Migration und Ausnahme entspricht, erschien nicht mehr. Also, das könnte dein Problem beheben:

    1. Entferne manuell bin, obj Ordner von deinem Startprojekt (welches deine Datenbank generiert / aktualisiert)
    2. Erstellen Sie Ihr Startprojekt oder reinigen und bauen Sie Ihre gesamte Lösung neu auf.
    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 generierte Datenbank und __MirgationHistory dem neuesten Migrationsskript entsprechen.



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




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

Kurzgeschichte lang:

Mein Modell und meine Anwendung waren in verschiedenen Baugruppen. Diese Assemblys verwiesen auf eine andere Version von Entity Framework. Ich vermute, dass die beiden Versionen für das gleiche Modell eine andere ID generiert haben. Wenn meine Anwendung lief, stimmte die ID des Modells nicht mit der letzten Migration in __MigrationHistory überein. Nach dem Aktualisieren aller Verweise auf die neueste EF-Version wurde der Fehler nie wieder angezeigt.




Related