it-swarm.com.de

Das Modell für den 'DataContext'-Kontext hat sich seit der Erstellung der Datenbank geändert

Ich versuche, Code First mit Migrationen zu verwenden. Obwohl an meinem Modell keine aktuellen Änderungen vorgenommen werden, erhalte ich eine Ausnahme. Wenn ich eine Migration hinzufüge, sind die Aufwärts- und Abwärtspfade leer, ich bekomme jedoch einen Laufzeitfehler mit der folgenden Meldung: 

Eine Ausnahme des Typs 'System.InvalidOperationException' ist in .__ aufgetreten. EntityFramework.dll wurde jedoch nicht im Benutzercode behandelt

Zusätzliche Informationen: Das Modell, das den Kontext 'MyDataContext' unterstützt hat sich seit der Erstellung der Datenbank geändert. Erwägen Sie die Verwendung von Code First Migrationen zum Aktualisieren der Datenbank ( http://go.Microsoft.com/fwlink/ ?

Meine Architektur ist wie folgt:

  • DataAccess-Projekt, das den Kontext, die Fluidkonfigurationen und den Migrationscode enthält
  • Modellprojekt, das die Poco-Klassen enthält
  • Web-API- und MVC-Projekte, die jeweils die Verbindungszeichenfolge in ihren jeweiligen web.config-Dateien enthalten.

Zusätzlich habe ich folgenden Code:

DbInitializer

public static MyDataContext Create()
{
   Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataAccess.MyDataContext, MyDataAccess.Migrations.Configuration>());
   return new MyDataContext(ConfigurationManager.ConnectionStrings["MyDataContext"].ConnectionString, null);
}

Ich habe mit AutomaticMigrationsEnabled = false angefangen. im Konstruktionskonstruktor für die Migration, da dies meines Erachtens verstanden wurde (und es erforderlich wäre), mehr Kontrolle darüber zu haben, wann Migrationen angewendet wurden. Ich habe auch versucht, dies auf "true" zu setzen, aber mit dem gleichen Ergebnis.

Nachdem ich diesen Fehler erhalten hatte, wurde eine neue Migration hinzugefügt, und die Up-Methode war leer. Ich habe die Datenbank auf diese neue Migration aktualisiert, und in der Tabelle _migrationHistory wurde ein Datensatz erstellt. Ich erhalte jedoch immer noch die Fehlermeldung, wenn ich versuche, die Anwendung auszuführen. Außerdem wurden die Seed-Daten nicht zur Datenbank hinzugefügt.

protected override void Seed(MyDataAccess.MyDataContext context)
{
            IdentityResult ir;

            var appDbContext = new ApplicationDbContext();
            var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(appDbContext));
            ir = roleManager.Create(new IdentityRole("Admin"));
            ir = roleManager.Create(new IdentityRole("Active"));
            ir = roleManager.Create(new IdentityRole("InActive"));

            var userNamager = new UserManager<User>(new UserStore<User>(appDbContext));

            //  assign default admin
            var admin = new User { UserName = "administrator", Email = "[email protected]" };
            ir = userNamager.Create(admin, "[email protected]");

            ir = userNamager.AddToRole(admin.Id, "Admin");
 }

woher

public class ApplicationDbContext : IdentityDbContext<User>
{
    public ApplicationDbContext()
        : base("MyDataContext", throwIfV1Schema: false)
    {
    }
    ...

Die Frage: Wenn bei Add-Migration keine Änderung im Modell angezeigt wird, warum wird diese Fehlermeldung angezeigt, wenn ich ausgeführt werde? Warum wird der Samencode nicht getroffen? Wie kann ich das beheben oder wenn das nicht festgestellt werden kann, wie kann ich die Ursache weiter ermitteln?

11
Steve Wash

Das hat für mich funktioniert.

Gehen Sie zur Package Manager Console und führen Sie "Update-Database -force" aus

7
Kyle Johnson

Ich bin nicht sicher, ob Sie die Antwort auf Ihr Problem gefunden haben, aber diese andere Antwort, die ich hier gefunden habe, hat sie tatsächlich für mich gemacht: Fehler beim Entity Framework-Modellwechsel

Ich löschte tatsächlich die __MigrationHistory-Tabelle in SQL Server, von der ich nicht wusste, dass sie automatisch erstellt wurde.

Der Artikel spricht auch über die Option, es nicht zu generieren, denke ich, indem ich diese Anweisung benutze: Database.SetInitializer<MyDbContext>(null); aber ich habe es nicht verwendet, daher bin ich mir nicht sicher, ob es so funktioniert 

17
Oscar

Mein Problem endete mit einem Konflikt zwischen der Aktivierung der automatischen Migrationen und dem Initialisierungsprogramm MigrateDatabaseToLatestVersion wie beschrieben in hier .

0
Steve Greene

Ich wette, Ihr Datenkontext hängt nicht von der Verbindungszeichenfolge ab ... __ Überprüfen Sie, ob sie nicht mit einer localdb (etwas wie (localdb)\v11.0) initialisiert wurde und nicht damit arbeitet, wenn Sie denken, dass sie auf etwas anderes gesetzt ist.

0
George Polevoy