2010-08-23 3 views
47

Ich habe ein "Nur Code" -POCO zur Verwendung mit einer vorhandenen Datenbank mit Entity Framework 4 und CTP4 erstellt. Wenn ich eine Abfrage ausführe, erhalte ich den FehlerEntity Framework Code Nur Fehler: Das Modell, das den Kontext unterstützt, hat sich seit dem Erstellen der Datenbank geändert

Ich bin unklar, warum das passiert oder was ich ändern kann. Ich habe lediglich den POCO erstellt, einen einfachen DbContext definiert, ein paar Verbesserungen vorgenommen und dann versucht, eine einfache Abfrage auszuführen. Da ich "Nur Code" verwende, sind mir keine Konfigurationseinstellungen bekannt, die vorgenommen werden müssen. Und ich möchte die Datenbank sicher nicht neu erstellen oder löschen, da es sich um eine vorhandene Datenbank handelt.

Danke für irgendwelche Ideen.

Antwort

72

Ich fand die Antwort in den Kommentaren zu diesem Beitrag auf Scott Guthries Blog.

http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx

For those who are seeing this exception:

"The model backing the 'Production' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance."

Here is what is going on and what to do about it:

When a model is first created, we run a DatabaseInitializer to do things like create the database if it's not there or add seed data. The default DatabaseInitializer tries to compare the database schema needed to use the model with a hash of the schema stored in an EdmMetadata table that is created with a database (when Code First is the one creating the database). Existing databases won’t have the EdmMetadata table and so won’t have the hash…and the implementation today will throw if that table is missing. We'll work on changing this behavior before we ship the fial version since it is the default. Until then, existing databases do not generally need any database initializer so it can be turned off for your context type by calling:

Database.SetInitializer<Production>(null); 
+4

Ich hatte gerade das gleiche Problem in 2013 mit EF5 von Ihrer Antwort behoben.Also haben sie es nicht aus irgendeinem guten Grund repariert, gibt es ein neues Muster für EF5? – rism

+2

FYI hatte das gleiche Problem mit EF6, das war überraschend. Diese Antwort löste mein Problem (integrierte asp.net-identity-generierte Tabellen auf meiner bestehenden SQL Server-Datenbank). – Rachael

+3

Mit EF6 habe ich nur die Datenbank manuell aktualisiert und die Migrationstabelle gelöscht. –

30

Dies ist ein Fehler in CTP4 für mit vorbestehenden Datenbanken EF verwenden.

Sie können das Problem beheben, indem Aufruf:

Database.SetInitializer<YourContext>(null); 

in Application_Start Methode der Global.asax

+0

Ich verwende MVC3. Ich habe der Modellklasse eine zusätzliche Spalte hinzugefügt. Ich habe Ihren Code auch in global.asax eingegeben. Allerdings bekomme ich immer noch den Fehler. Ich glaube nicht, dass alte db gelöscht oder neu erstellt wird. Wie kann ich dem Modell eine neue Spalte hinzufügen und die db löschen und neu erstellen? – bonCodigo

+0

'protected void Application_Start()' ' {' ​​' Database.SetInitializer (null);' ' AreaRegistration.RegisterAllAreas();' ' RegisterGlobalFilters (GlobalFilters.Filters);' 'RegisterRoutes (RouteTable.Routes);' '}' – bonCodigo

+0

Downvoted, da die Frage keine Asp.net-Frage ist –

13

ich oben ausgeführt und es zu der Zeit gearbeitet, als ich mit EF5 spielen nur um mich familarise mit es funktioniert. Jetzt schreibe ich "tatsächlichen" Code und ich bin von der Einstellung eines Datenbankinitialisierers pro Kontext im Code weggegangen, wegen einer Architektur, die ich mit MEF festgelegt habe, um jeden DbContext zu instanziieren und alle Konfigurationsabhängigkeiten als zusammensetzbare Teile zu injizieren.

Also habe ich sofort den oben beschriebenen Fehler behoben, aber dieses Mal habe ich entschieden, das Problem mit den folgenden Konfigurationsdateien zu lösen.

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <contexts> 
     <context type="Basd.Erp.ContactContext, Basd.Erp" disableDatabaseInitialization="true"></context> 
    </contexts> 
    </entityFramework> 

So indem disableDatabaseInitialization = „true“ in der Konfigurationsdatei Abschnitt für EntityFramework können Sie die Fehler oben und da es nicht im Code einer der Vorteile ist die Fähigkeit, beschrieben überwinden „leichter“ Verwendung abstrahiert Bauer/factories, um einen Kontext zu erstellen.

+0

Ich hatte dieses Problem noch in EF6, als mein Kontext in separaten Assembly war. Dies ist eine gute Antwort, wie @Rism für abstrahierte "n-Tier" -Lösungen vorgeschlagen hat. – trevorc

3

Alles, was ich tun musste, war die __MigrationHistory Tabelle fallen zu lassen.

Kontext:

ich diesen Fehler empfangen, wenn ich den Namen einer Tabelle geändert. Nachdem ich die Annotation [Table("NewTableName")] einem meiner Modelle hinzugefügt hatte, generierte Entity Framework eine __MigrationHistory Tabelle.

0

Ich hatte das gleiche Problem - erneut hinzufügen der Migration und die Aktualisierung der Datenbank hat nicht funktioniert und keiner der oben genannten Antworten schien richtig. Dann traf mich die Inspiration - ich benutze mehrere Ebenen (ein Web, eine Daten und ein Geschäft). Die Web-Schicht hat diese Ausnahme nie ausgelöst - sie war die Business-Schicht (die ich als Konsolenanwendung zum Testen und Debuggen eingerichtet habe). Stellt fest, dass die Business-Schicht nicht die richtige Verbindungszeichenfolge verwendet hat, um die db abzurufen und den Kontext zu erstellen. Also habe ich die Verbindungszeichenfolge zur App-Konfiguration hinzugefügt und Viola funktioniert. Setzen Sie das hier für andere, die das gleiche Problem auftreten können.

Verwandte Themen