Die Fehlermeldung:
"Das Modell, das den 'AddressBook'-Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert. Löschen / aktualisieren Sie die Datenbank entweder manuell oder rufen Sie Database.SetInitializer mit einer IDatabaseInitializer-Instanz auf. Beispielsweise löscht die Strategie RecreateDatabaseIfModelChanges die Datenbank automatisch und erstellt sie neu optional mit neuen Daten versehen. "
Ich versuche, die Code-First-Funktion zu verwenden, und habe Folgendes geschrieben:
var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
var contact = new Contact
{
ContactID = 10000,
FirstName = "Brian",
LastName = "Lara",
ModifiedDate = DateTime.Now,
AddDate = DateTime.Now,
Title = "Mr."
};
context.contacts.Add(contact);
int result = context.SaveChanges();
Console.WriteLine("Result :- "+ result.ToString());
}
Die Kontextklasse:
public class AddressBook : DbContext
{
public AddressBook()
{ }
public AddressBook(DbModel AddressBook)
: base(AddressBook)
{
}
public DbSet<Contact> contacts { get; set; }
public DbSet<Address> Addresses { get; set; }
}
und die Verbindungszeichenfolge:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="AddressBook" providerName="System.Data.SqlClient"
connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
Integrated Security=True;MultipleActiveResultSets=True;"/>
</connectionStrings>
</configuration>
Der Datenbankname lautet also "AddressBook" und der Fehler tritt auf, wenn ich versuche, das Kontaktobjekt zum Kontext hinzuzufügen. Vermisse ich hier etwas?
.net
entity-framework-4
code-first
Ashish Gupta
quelle
quelle
Antworten:
Jetzt ist es:
in Ihrer YourDbContext.cs-Datei.
quelle
Hier sind einige Informationen aus dem Blog von Scott Gu, die von Jeff gepostet wurden, was tatsächlich stattfindet:
quelle
Invalid object name 'dbo.Table
Überprüfung Ihrer Verbindungszeichenfolge attachDbFilename und ersten Katalog erhaltenFür Entity Framework 5.0.0.0 - 6.1.3
Sie DO wollen in der Tat folgendes tun:
Ja, Matt Frear ist richtig. UPDATE -EDIT: Vorsichtsmaßnahme ist, dass ich anderen darin zustimme, anstatt diesen Code zu global.asax hinzuzufügen, das Ihrer DbContext-Klasse hinzugefügt wurde
Wie bereits erwähnt, eignet sich dies auch gut für die Durchführung von Unit-Tests.
Derzeit verwende ich dies mit Entity Framework 6.1.3 /.net 4.6.1
Ich werde in naher Zukunft wiederkommen, um einen CORE-Ausschnitt bereitzustellen.
quelle
Führen Sie einfach den folgenden Befehl sql in SQL Server Management Studio aus:
quelle
Dieser Fix funktioniert nach CTP5 nicht mehr.
Du musst
Database.SetInitializer<YourContext>(null);
quelle
Habe gerade die Antwort herausgefunden und dachte daran, hier zu aktualisieren. Ich muss nur Folgendes tun.
quelle
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
hilft auch nicht weiter. DbDatabase.SetInitialzer (null); funktioniert.Oder Sie können diese Zeile in Ihre Global.asax.cs-Datei unter Application_Start () einfügen:
Stellen Sie sicher, dass Sie ProjectName.Path.Context in Ihren Namespace und Kontext ändern. Wenn Sie zuerst Code verwenden, wird diese gelöscht und eine neue Datenbank erstellt, wenn Änderungen am Schema vorgenommen werden.
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 alte 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), die der letzten Migration entsprechen, und Ausnahme wurde nicht mehr angezeigt. Dies kann also Ihr Problem beheben:
quelle
Für mich schneide ich mit dem Upgrade auf 4.3.1 einfach die EdmMetaData-Tabelle ab oder lösche sie einfach sofort.
quelle
Für VB.NET-Entwickler:
Fügen Sie der Datei Glabal.asax.vb am Ende der Methode Application_Start () die folgende Zeile hinzu.
Ändern Sie ApplicationDbContext in Ihren spezifischen Datenbankkontext.
quelle
Ich hatte dieses Problem und es stellte sich heraus, dass ein Projekt auf SQLExpress zeigte, das mit dem Problem jedoch auf LocalDb. (in ihrer jeweiligen web.config). Dummes Versehen, aber erwähnenswert, falls jemand anderes dieses Problem behebt.
quelle
Dies bedeutet, dass einige Änderungen am Kontext vorgenommen wurden, die nicht ausgeführt wurden. Führen Sie zuerst Add-Migration aus, um die vorgenommenen Änderungen zu generieren (die Änderungen, die uns möglicherweise nicht bekannt sind), und führen Sie dann Update-Database aus
quelle
Ich hatte das gleiche Problem - das erneute Hinzufügen der Migration und das Aktualisieren der Datenbank funktionierten nicht und keine der obigen Antworten schien richtig zu sein. Dann traf mich die Inspiration - ich verwende mehrere Ebenen (ein Web, ein Daten- und ein Unternehmen). Die Datenschicht hat den Kontext und alle Modelle. Die Webschicht hat diese Ausnahme nie ausgelöst - es war die Geschäftsschicht (die ich als Konsolenanwendung zum Testen und Debuggen festgelegt habe). Es stellte sich heraus, dass die Business-Schicht nicht die richtige Verbindungszeichenfolge verwendete, um die Datenbank abzurufen und den Kontext zu erstellen. Also habe ich die Verbindungszeichenfolge zur App-Konfiguration der Business-Schicht (und der Datenschicht) hinzugefügt und Viola funktioniert. Stellen Sie dies hier für andere ein, die möglicherweise auf dasselbe Problem stoßen.
quelle
Ich verwende die Database.CompatibleWithModel-Methode (verfügbar in EF5), um zu testen, ob das Modell und die Datenbank übereinstimmen, bevor ich sie verwende. Ich rufe diese Methode direkt nach dem Erstellen des Kontexts auf ...
quelle
Guter Vorschlag, jedoch nicht in allen Fällen so genau. Ich finde einen heraus. Bitte stellen Sie sicher, dass Sie "enable-migrations" unter Verwendung von PM-Fenstern in Visual Studio ausführen und der Migrationsordner zu Ihrem Projekt hinzugefügt wird.
Stellen Sie sicher, dass die beiden c # -Klassendateien, die dem Ordner hinzugefügt wurden, alle Ihre Modelle und ihre jeweiligen Eigenschaften enthalten.
Wenn Sie alle haben, die die Lösung erstellen, und veröffentlichen Sie sie für die Bereitstellung.
Die Logik ist, dass die vorhandenen Metadaten nicht überschrieben werden können, da Ihre Anwendung keine Metadaten hat, die die aktuellen ersetzen könnten. Als Ergebnis wird folgende Fehlermeldung angezeigt: "Das Modell, das den Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert."
quelle
Nur für den Fall, dass jemand das gleiche Szenario wie ich hat.
Ich habe zuerst die Datenbank EF und benutze gleichzeitig die asp.net-Identität
Ich habe also zwei connectionStrings in meiner Webkonfiguration, und damit gibt es kein Problem. Es ist passiert, dass ich die Skripte erstellt / ausgeführt habe, um manuell die asp.net-Identitätstabellen zu generieren, die ich nicht sollte.
DROP also zuerst alle von Ihnen manuell / aus Skripten erstellten asp.net-Identitätstabellen.
quelle
Keine dieser Lösungen würde für uns funktionieren (außer das Deaktivieren der Schemaüberprüfung insgesamt). Am Ende hatten wir ein Miss-Match in unserer Version von Newtonsoft.json
Unsere AppConfig wurde nicht korrekt aktualisiert:
Die Lösung bestand darin, die Assembly-Version auf die Version zu korrigieren, die wir tatsächlich bereitgestellt haben
quelle
Nach einigen Recherchen zu diesem Thema stellte ich fest, dass der Fehler im Grunde genommen auftritt, wenn Sie eine Instanz von db zuvor auf Ihrem lokalen SQL Server Express erstellt haben. Wenn Sie also Updates für db haben und versuchen, die Datenbank zu aktualisieren / Code auf db ausführen, ohne den
Update Database
Befehl using auszuführenPackage Manager Console
; Zunächst müssen Sie die vorherige Datenbank in unserem lokalen SQL Express manuell löschen.Diese Lösung funktioniert auch, es sei denn, Sie haben
AutomaticMigrationsEnabled = false;
in Ihrer Konfiguration.Wenn Sie mit einem Versionskontrollsystem (git, svn usw.) Arbeiten und einige andere Entwickler DB-Objekte in der Produktionsphase aktualisieren, tritt dieser Fehler immer dann auf, wenn Sie Ihre Codebasis aktualisieren und die Anwendung ausführen.
Wie oben erwähnt, gibt es hierfür einige Lösungen auf Codebasis. Dies ist jedoch in einigen Fällen die praktischste.
quelle
Ich lese auch das Pro ASP.NET MVC 4-Buch und bin auf dasselbe Problem gestoßen, das Sie hatten. Bei mir trat das Problem auf, nachdem ich die im Abschnitt "Hinzufügen von Modellvalidierung" des Buches vorgeschriebenen Änderungen vorgenommen hatte. Ich habe das Problem gelöst, indem ich meine Datenbank von localdb auf den vollständigen SQL Server 2012-Server verschoben habe. (Übrigens, ich weiß, dass ich das Glück habe, auf die vollständige Version umsteigen zu können, also hasse mich nicht. ;-))) Die Kommunikation mit der Datenbank muss etwas enthalten, das das Problem verursacht.
quelle
Überprüfen Sie die folgenden Schritte
2.
quelle
Ändern
Global.asax.cs
, einschließlich desApplication_Start
Ereignisses mit:quelle
Dieser Fehler kann auf ein Problem mit Ihrer Verbindungszeichenfolge hinweisen und darauf, ob der Name Ihrer Verbindungszeichenfolge mit der Datenbankkontextdeklaration übereinstimmt.
Ich hatte diesen Fehler, weil ich die lokale Datenbank falsch benannt hatte (dummer Fehler) und der Name der Verbindungszeichenfolge in web.config von "DefaultConnection" nicht mit MyDbContext übereinstimmte, d. H.
quelle
Versuchen Sie es mit Database SetInitializer, der zur Verwendung von System.Data.Entity gehört.
In Global.asax
Dadurch wird jedes Mal eine neue Datenbank erstellt, wenn Ihr Modell geändert wird. Ihre Datenbank wäre jedoch leer. Um sie mit Dummy-Daten zu füllen, können Sie Seeding verwenden. Was Sie implementieren können als:
Seeding ::
quelle
Es ist komisch, aber alle Antworten hier waren für mich nutzlos. Für mich arbeitete Initialisierer
MigrateDatabaseToLatestVersion
Hier ist meine Lösung (ich weiß, es kann viel einfacher sein, aber so benutze ich es):
MyDbInitializerForTesting erbt nur von DropCreateDatabaseAlways, sodass in einem bestimmten Fall (Test) die gesamte Datenbank neu erstellt wird. Andernfalls wird es auf die neueste Version migriert.
Meine Quelle: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific
quelle
Ich hatte das gleiche Problem, als wir eine Datenbank für zwei Anwendungen verwendeten. Das Einstellen
disableDatabaseInitialization="true"
im Abschnitt Kontexttyp funktioniert bei mir.Weitere Informationen finden Sie unter https://msdn.microsoft.com/en-us/data/jj556606.aspx
quelle
Erstellen Sie einen benutzerdefinierten Kontextinitialisierer:
Beachten Sie, dass Migrations.Configuration eine Klasse ist, die über die Migrationsbefehlszeile in der Package Manager-Konsole generiert wird. Möglicherweise müssen Sie den internen in den öffentlichen Modifikator der Migrations.Configuration-Klasse ändern.
Und registrieren Sie es von Ihrem OmModelCreating:
quelle
Hier möchte ich eine andere Methode vorstellen, die den Fehler der Modellunterstützung verhindert, wenn sich der Kontext ändert:
1) Öffnen Sie Ihre DbContext-Datei
2) Fügen Sie einen Namespace mit Microsoft.AspNet.Identity.EntityFramework hinzu.
3) public MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (new DropCreateDatabaseAlways ()); }}
quelle