Erstens habe ich diesen Fehler nirgendwo anders gesehen und ich denke, es ist kein Replikat. Bitte lesen Sie zuerst die gesamte Situation.
Alles hat gut funktioniert, dann habe ich versucht, eine meiner Modellklassen zu aktualisieren (die App-Klasse und das Update werden jetzt kommentiert), die ich unten auflisten werde. und boom ich hatte diesen hässlichen fehler.
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 ). unter System.Data.Entity.CreateDatabaseIfNotExists
1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf
1.b__e () unter System.Data.Entity.Internal.InternalContext.PerformInitializationAction (Aktionsaktion) unter System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization (). Internal.LazyInternalContext.b__4 (InternalContext c) bei System.Data.Entity.Internal.RetryAction1.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.InternalTon entityType) bei System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet
1.Include (String-Pfad) bei System.Data.Entity.Infrastructure.DbQuery1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable
1-Quelle, String-Pfad) bei System.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable1 source, Expression
1-Pfad) bei Microsoft.AspNet.Identity. EntityFramework.UserStore6.GetUserAggregateAsync(Expression
1-Filter) bei Microsoft.AspNet.Identity.EntityFramework.UserStore6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager
2.FindByNameAsync (String userName) bei Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext () --- Ende der Stapelverfolgung vom vorherigen Speicherort wo Ausnahme wurde ausgelöst --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task-Task) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task-Task) bei ControlPanel.Web.Controllers.Axtount : \ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs: Zeile 56
Zuerst dachte ich, es könnte sich um ein Migrationsproblem handeln, also habe ich die Datenbank vollständig gelöscht, die Migrationen wieder aktiviert, eine Init-Migration hinzugefügt und die Datenbank mithilfe von aktualisiert
update-database -force -verbose
Ohne Beschwerden läuft alles gut, aber wenn ich versuche, mich auf meiner Website anzumelden, wird der vorherige Fehler angezeigt. Ich habe die Migrationssache ungefähr zehn Mal durchgeführt, ohne das Problem lösen zu können.
Hier sind meine Domainklassen (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");
}
}
Antworten:
Nur für den Fall, dass jemand anderes darauf stößt, der eine Datenbank-erste Implementierung wie ich durchgeführt hat.
Ich habe eine Änderung vorgenommen
ApplicationUser
, indem ich die Klasse erweitert und dem Feld ein neues Feld hinzugefügt habeAspNetUsers
Tabelle habe und diesen Fehler beim Start hatte.Ich konnte dies beheben, indem ich den in der
__MigrationHistory
Tabelle erstellten Datensatz löschte (es gab nur einen Datensatz). Ich gehe davon aus, dass EF entschieden hat, dass ich meine Datenbank mit dem Migrationstool aktualisieren muss - aber ich hatte dies bereits manuell selbst getan.quelle
ApplicationDbContext
Das hat bei mir funktioniert - keine weiteren Änderungen erforderlich.
quelle
Dieser Beitrag hat mein Problem behoben. Es ist alles über die folgende Zeile in
Application_Start()
inGlobal.asax
:Database.SetInitializer<Models.YourDbContext>(null);
Es führt jedoch zu einer Neuerstellung der Datenbank bei jeder Bearbeitung in Ihrem Modell, und Sie können Ihre Daten verlieren.
quelle
Wenn Sie die Tabelle "[__MigrationHistory]" aus Ihrer "Datenbank> Systemtabellen" löschen, funktioniert dies.
quelle
[__MigrationHistory]
Tabelle aktualisieren Sie jedoch auch das EDMX-mmodel.Es war so ein seltsamer Fehler. Es war nicht mein Fehler am Ende, sondern der von Microsoft. Ich habe das Entity-Framework in der "Pre-Release" -Version installiert und es war für diesen Fehler verantwortlich, als ich auf den Stable aktualisiert habe Lassen Sie es verschwinden. Vielen Dank. Alle glauben mir, als ich diese Frage gestellt habe. Ich habe ungefähr eine Woche lang nach ihrer Lösung gesucht. Ich bin mir ziemlich sicher, dass dieses Problem nirgendwo anders auftritt: Die Version der Entity Framework.dll, die das verursacht hat Problem war 6.0.2, wenn es hilft.
quelle
Jeder, der durch diesen Fehler Kopfschmerzen bekommt: Stellen Sie unbedingt 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 des Entity-Frameworks. Ich denke, dass die beiden Versionen eine unterschiedliche ID für dasselbe Modell generiert haben. Als meine Anwendung ausgeführt wurde, stimmte die ID des Modells nicht mit der neuesten Migration in __MigrationHistory überein. Nach dem Aktualisieren aller Verweise auf die neueste EF-Version wurde der Fehler nie wieder angezeigt.
quelle
Ich habe viele Tage damit verbracht, dieses Problem zu lösen, viele verschiedene Beiträge analysiert und viele Optionen ausprobiert und schließlich behoben. Diese 2 Projekte in meiner Lösung mit EF-Code erste Migrationen:
Ich habe diesen Fehler erhalten, als ich WebApi angefordert habe ...
Meine Umgebung:
Hier habe ich alle Anmerkungen gesammelt, auf die Sie achten sollten, sowie alle Bedingungen / Anforderungen, die erfüllt sein müssen, um die genannten Ausnahmen zu vermeiden:
Name der Verbindungszeichenfolge, z. B. MyConnectionString in der Konfigurationsdatei des Startprojekts (Web.config / App.config):
sollte gleich dem Parameter sein, der im Konstruktor Ihres DbContext übergeben wurde:
Und das Hauptproblem, das mein Problem behoben hat: Es ist seltsam, 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, aktualisierte meine WebApi-Datenbank mithilfe alter Mirgationen. Ich war verwirrt, warum die Datenbank nach dem Aktualisieren in WebApi nicht dem neuesten Migrationsskript von DataModel entspricht. Der folgende Code erstellt automatisch (falls nicht vorhanden) oder aktualisiert die neueste lokale Migrationsdatenbank in meinem WebApi / App_Data-Ordner.
Ich habe versucht, die Lösung zu bereinigen und neu zu erstellen, aber es hat nicht geholfen, als ich die Ordner bin und obj vollständig aus WebApi entfernt, Datenbankdateien aus WebApi / App_Data gelöscht, WebApi erstellt, neu gestartet, eine Anfrage gestellt und eine korrekte Datenbank erstellt habe - verzögerte Initialisierung (mit Zeilen oben), was der letzten Migration entspricht, und Ausnahme wurde nicht mehr angezeigt. Dies kann also Ihr Problem beheben:
quelle
Dies kann passieren, wenn Sie die Datenanmerkung einer Modelleigenschaft ändern. Zum Beispiel: Hinzufügen von [Erforderlich] einer Eigenschaft wird das Datenbankdesign ausstehend geändert.
Die sicherste Lösung ist die Ausführung auf der Package Manager-Konsole:
Hier werden die genauen Änderungen in der Up () -Methode angezeigt. Daher können Sie entscheiden, ob Sie solche Änderungen wirklich anwenden möchten, indem Sie:
Andernfalls können Sie einfach die letzte Migration aus der Tabelle __MigrationHistory und im Projektmappen-Explorer aus dem Ordner Migrations löschen.
quelle
Ich hatte das gleiche Problem wie a7madx7, aber mit einer stabilen Version von EF (v6.1.1) und fand eine Lösung in:
http://cybarlab.com/context-has-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-3
Der zweite Link enthält eine spezielle Erwähnung für VB ..... "Sie können einfach den gesamten Datenbankkontext, bei dem dieses Problem auftritt, in Ihre app_start-Methode in der Datei global.asax wie folgt einfügen" :
NB: Ich musste "DatabaseContext" durch den Namen meiner Klasse ersetzen, die DbContext implementiert
Update: Wenn Sie den Codefirst-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 dann SetInitializer aus global.asax entfernen.
quelle
Löschen Sie einfach den Migrationsverlauf in _MigrationHistory in Ihrer Datenbank. Es hat bei mir funktioniert
quelle
Ich habe gerade ein ähnliches Problem gelöst, indem ich alle Dateien im Website-Ordner gelöscht und dann erneut veröffentlicht habe.
quelle
Entfernen Sie alle Tabellenidentitäten
quelle
Klicken Sie im Menü Extras auf NuGet Package Manager und dann auf Package Manager Console (PMC). Geben Sie die folgenden Befehle in das PMC ein.
Enable-Migrations Add-Migration Init Update-Datenbank Führen Sie die Anwendung aus. Die Lösung des Problems ist von hier
quelle
Bei der Entwicklung bevorzuge ich die Verwendung dieser praktischen Klasse zum Konfigurieren von Migrationen.
Ich hoffe es hilft.
quelle
Das Löschen von Zeilen in der Tabelle [__MigrationHistory] mit Older productVersion hat bei mir funktioniert. Diese Antwort ist für diejenigen gedacht, 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!
quelle
Unten war die ähnliche Art von Fehler, auf die ich gestoßen bin
Das Modell, das den 'PsnlContext'-Kontext 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);
Dies hat das Problem behoben
quelle
Der Fehler bedeutet einfach, dass Ihre Modelle Änderungen aufweisen und nicht mit der Datenbank synchronisiert sind. Wechseln Sie daher zur Paketmanagerkonsole.
add-migration foo2
Dies gibt einen Hinweis darauf, was das Problem verursacht. Vielleicht haben Sie etwas entfernt oder in meinem Fall entferne ich eine Datenanmerkung . Von dort aus können Sie die Änderung erhalten und sie hoffentlich in Ihrem Modell umkehren.danach foo2 löschen.
quelle
Ich weiß, dass ich sehr spät bin, aber ich möchte auch einen Beitrag leisten. Dieser Fehler ist wirklich seltsam, da der Browser nicht verstehen kann, wie die Änderungen gerendert werden sollen, da sich die Klassen und ihre Eigenschaften möglicherweise geändert haben, aber nicht in die Datenbank übernommen wurden.
Also mach eine Sache,
Erstellen Sie mit diesem Befehl eine Migration in der Package Manager-Konsole (Tools> NuGet Package Manager> Package Manager-Konsole) :
Dabei ist UpdateMigration der Name Ihrer Migration. Sie können ihm einen beliebigen Namen geben, aber bitte geben Sie genau an.
Danach müssen wir nur noch die Datenbank aktualisieren, also führen Sie Folgendes aus:
Nachdem Sie Ihre Änderungen an der Datenbank vorgenommen haben, aktualisieren Sie einfach Ihren Browser und los geht's!
Hoffe das hilft.
quelle
Dies liegt daran, dass Sie einem Ihrer Modelle eine Eigenschaft hinzufügen und dies nicht getan haben
update-Database
. Um dies zu lösen, müssen Sie es aus dem Modell entfernen oder Sie müssenadd-migration anyProperName
mit diesen Eigenschaften undUpdate-database
.quelle
Dieser Fehler trat bei mir auf, als ich Änderungen an meinem Modell vornahm und keine Migration für die Änderungen zum Aktualisieren der Datenbank durchführte.
Wenn Sie jemals Änderungen an Ihrem Modell im Code First-Migrationsschema vorgenommen haben
Vergessen Sie nicht, die Migration hinzuzufügen
Der obige Befehl liest alle Änderungen, die Sie am Modell vorgenommen haben, und schreibt sie in die Methoden Up () und Down ().
Aktualisieren Sie dann einfach Ihre Datenbank mit dem folgenden Befehl.
Das hat bei mir funktioniert.
quelle
Löschen Sie die vorhandene Datenbank, erstellen Sie eine neue Datenbank mit demselben Namen, kopieren Sie alle Daten ... es wird funktionieren
quelle