wake-up-neo.com

Entity Framework 4.1 Das Modell, das den Kontext unterstützt, hat sich seit der Erstellung der Datenbank unmittelbar nach der Erstellung der Datenbank geändert

Ich arbeite an einem Projekt, das Entity Framework 4.1 verwendet, um die verschiedenen Objekte in der Datenbank zu speichern (Code zuerst).

Ich teste in Visual Studio mit einer lokalen SQL Express-Datenbank, und unser Jenkins-Server stellt festgeschriebenen Code auf einem Testserver bereit. In diesem Fall ändere ich meine lokale Verbindungszeichenfolge vorübergehend so, dass sie auf den testenden DB-Server verweist, und führe einen Komponententest durch, um die Testdatenbank neu zu erstellen, damit sie unseren neuesten Entitäten entspricht.

Ich habe kürzlich bemerkt, dass unser Testserver diesen Fehler ausgibt:

Das Modell, das den Kontext 'EntityFrameworkUnitOfWork' unterstützt, hat sich geändert, seit die Datenbank erstellt wurde. Löschen/aktualisieren Sie die Datenbank manuell oder rufen Sie Database.SetInitializer mit einer IDatabaseInitializer-Instanz auf. Beispielsweise löscht und erstellt die DropCreateDatabaseIfModelChanges-Strategie die Datenbank automatisch und erstellt sie neu. Optional können neue Daten hinzugefügt werden.

Dies ist normalerweise ein Hinweis darauf, dass sich unser Code geändert hat und ich den Komponententest ausführen muss, um die Datenbank neu zu erstellen. Nur dass ich das gerade getan habe! Ich glaube nicht, dass irgendetwas mit unserem Bereitstellungsprozess nicht stimmt - die DLLs auf dem Testserver scheinen die gleichen Versionen zu haben wie in meiner lokalen Umgebung. Gibt es andere Einstellungen oder Umgebungsfaktoren, die diesen Fehler verursachen können, wenn sich das Modell seit der Erstellung der Datenbank geändert hat?

Ich bin neu hier - danke für jede Hilfe!

24
DaveBeta

Der angezeigte Fehler bedeutet, dass sich der in der Tabelle EdmMetadata gespeicherte Modell-Hash von dem Modell-Hash unterscheidet, der aus dem Modell in der Anwendung berechnet wurde. Da Sie die Datenbankerstellung von einer anderen Anwendung (Ihrer Entwickleranwendung) aus ausführen, ist es möglich, dass sich diese beiden unterscheiden. Ein einfacher Rat ist hier: Verwenden Sie keine unterschiedlichen Anwendungen für die Datenbankerstellung, sondern lassen Sie Ihre Hauptanwendung die Datenbank erstellen (entweder automatisch oder zum Beispiel mit einer Verwaltungsschnittstelle).

Als weitere Option sollten Sie in der Lage sein, diese Prüfung vollständig zu deaktivieren, indem Sie die Konvention entfernen, die für diese Prüfungen verantwortlich ist:

modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

Die Modell-Hash-Berechnung ist abhängig von den aktuellen Entitäten in Ihrer Anwendung (jede einfache Änderung führt zu einem anderen Modell-Hash) und von den Versionen/Manifesten des Datenbankservers. Beispielsweise hat ein Modell, das auf SQL Server 2005 und 2008 bereitgestellt wird, einen anderen Modell-Hash (Express vs. Full oder 2008 vs. 2008 R2 sollte nicht zu einem anderen Modell-Hash führen).

25
Ladislav Mrnka

Dies kann auf Unterschiede in der Reflektionsreihenfolge zwischen verschiedenen Plattformen zurückzuführen sein. Zur Überprüfung können Sie die EdmxWriter-API verwenden, um den EDMX aus beiden Umgebungen zu vergleichen. Wenn eine der Tabellen eine andere Spaltenreihenfolge aufweist, ist dies das Problem.

Um dies zu umgehen, können Sie die Art und Weise ändern, in der Ihre Testdatenbank aktualisiert wird, sodass sie von Ihrem Testserver und nicht von Ihrer lokalen Box aktualisiert wird.

Wir werden dieses Problem in der nächsten Version beheben.

9
Andrew Peters

Beim Code-First-Ansatz wird die SSDL während der Ausführung des Codes generiert. Eine der in der generierten SSDL enthaltenen Informationen ist der Name des Anbieters, der in der DbConnection verwendet wird. Wie Sie bereits sagten, stellen Sie eine Verbindung zu verschiedenen Datenbankmodulen her, sodass Sie zwei verschiedene Anbieter verwenden müssen. Dadurch wird die Ausgabe der Hashing-Funktion vollständig geändert.

Der folgende Code wurde aus der EntityFramework-Assembly extrahiert:

using (XmlWriter writer = XmlWriter.Create(output, settings))
{
    new SsdlSerializer().Serialize(database, providerInfo.ProviderInvariantName, providerInfo.ProviderManifestToken, writer);
}
6
Diego Frata

Dies könnte helfen und der Link zum Scott G Blog wird sicher eine Lösung für Ihr Problem sein. Überprüfen Sie diese Frage link

Edit 1: Dies ist der Link zum Scott G Blog

Bearbeiten 2: Sie können auch dies überprüfen, wenn Sie zuerst eine Datenbank auf dem Integrationsserver verwenden

Edit 3: Dies ist eine detailliertere Antwort wie die von Scott G

3
radu florescu

Führen die beiden Server Ihrer Anwendung unterschiedliche Betriebssysteme (oder Service Packs) aus? Es scheint, dass der verwendete SHA256CryptoService eine PlatformNotSupportedException auslösen kann, die ein Zurückgreifen auf eine andere Methode verursacht.

http://msdn.Microsoft.com/en-us/library/system.security.cryptography.sha256cryptoserviceprovider.sha256cryptoserviceprovider.aspx

// System.Data.Entity.Internal.CodeFirstCachedMetadataWorkspace
private static SHA256 GetSha256HashAlgorithm()
{
  SHA256 result;
  try
  {
    result = new SHA256CryptoServiceProvider();
  }
  catch (PlatformNotSupportedException)
  {
    result = new SHA256Managed();
  }
  return result;
}

Ist möglicherweise in Lage, das zu testen, indem Sie Reflection verwenden, um die folgenden 2 (internen/privaten) Methoden auf jedem Server aufzurufen.

MetaDataWorkspace.ToMetadataWorkspace(DbDatabaseMapping, Action<string>)
CodeFirstCachedMetadataWorkspace.ComputeSha256Hash(string xml);
3
Betty

Entity Framework-Code erstellt zunächst eine Tabelle mit dem Namen EdmMetadata. Es enthält einen Hash Ihres aktuellen Modells. Sobald Sie die Anwendung EF ausgeführt haben, wird überprüft, ob das verwendete Modell mit dem Modell übereinstimmt, das der Datenbank bekannt ist.

Wenn Sie eine Datenbankmigration durchführen möchten, empfehlen wir die Verwendung von EF Code first migrations , obwohl es sich immer noch um ein Alpha handelt.

Wenn Sie keine Migrationen verwenden möchten, haben Sie folgende Möglichkeiten:

behandeln Sie die Schemaänderung manuell. Dies bedeutet, dass der Inhalt der EdmMetadata-Tabelle zusammen mit allen Änderungen auf den Testserver verschoben wird

oder

setzen Sie den DB-Initialisierer auf DropCreateDatabaseIfModelChanges (oder besser auf etwas, das davon abgeleitet ist, und verwenden Sie die Seed () - Methode, um die Anfangsdaten zu schreiben). Um den Initialisierer einzustellen, rufen Sie entweder Database.SetInitializer () beim Start der Anwendung auf oder verwenden Sie die appSettings

<add key="DatabaseInitializerForType Fully.Qualified.Name.Of.Your.DbContext," value="Fully.Qualified.Name.Of.The.Initializer" />
2
Chris

Ich habe meine .mdf-Datei nur versehentlich umbenannt und diesen Fehler erhalten. Suchen Sie also auch danach.

0
Roman Pawlig