Wie aktiviere ich Entity Framework 5-Migrationen (Version 5.0.0) für mehrere DB-Kontexte im selben Projekt, wobei jeder Kontext einer eigenen Datenbank entspricht? Wenn ich Enable-Migrations
in der PM-Konsole (Visual Studio 2012) ausgeführt werde, tritt ein Fehler auf, da mehrere Kontexte vorhanden sind:
PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.
Wenn ich ausgeführt Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext
werde, darf ich nicht ausgeführt werden, Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext
da bereits eine Migration vorhanden ist:Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.
Antworten:
Der zweite Aufruf von Enable-Migrations schlägt fehl, da die Datei Configuration.cs bereits vorhanden ist. Wenn Sie diese Klasse und Datei umbenennen, sollten Sie in der Lage sein, diese 2. Aktivierungsmigrationen auszuführen, wodurch eine weitere Configuration.cs erstellt wird.
Anschließend müssen Sie angeben, welche Konfiguration Sie beim Aktualisieren der Datenbanken verwenden möchten.
quelle
Zusätzlich zu dem, was @ckal vorgeschlagen hat, ist es kritisch jeder umbenannt Configuration.cs seinen eigenen Namensraum zu geben. Wenn Sie dies nicht tun, versucht EF, Migrationen auf den falschen Kontext anzuwenden.
Hier sind die spezifischen Schritte, die für mich gut funktionieren.
Wenn Migrationen durcheinander sind und Sie eine neue "Baseline" erstellen möchten:
Erstellen der ersten Migration:
In der Package Manager-Konsole:
Im Projektmappen-Explorer: Benennen Sie Migrations.Configuration.cs in Migrations.ConfigurationA.cs um. Dies sollte den Konstruktor automatisch umbenennen, wenn Sie Visual Studio verwenden. Stellen Sie sicher, dass dies der Fall ist. ConfigurationA.cs bearbeiten: Ändern Sie den Namespace in NamespaceOfContext.Migrations.MigrationsA
Im Projektmappen-Explorer: Benennen Sie Migrations.Configuration.cs in Migrations.ConfigurationB.cs um. Stellen Sie erneut sicher, dass der Konstruktor auch entsprechend umbenannt wird. ConfigurationB.cs bearbeiten: Ändern Sie den Namespace in NamespaceOfContext.Migrations.MigrationsB
Schritte zum Erstellen von Migrationsskripten in der Package Manager-Konsole:
Führen Sie den Befehl aus
oder -
Es ist in Ordnung, diesen Befehl erneut auszuführen, bis Änderungen auf die Datenbank angewendet werden.
Führen Sie die Skripte entweder für die gewünschte lokale Datenbank aus oder führen Sie Update-Database without -Script aus, um sie lokal anzuwenden:
oder -
quelle
Ich bin gerade auf dasselbe Problem gestoßen und habe die folgende Lösung verwendet (alle von Package Manager Console).
Dadurch werden zwei separate Ordner im Migrationsordner erstellt. Jedes enthält die generierte
Configuration.cs
Datei. Leider müssen Sie dieseConfiguration.cs
Dateien noch umbenennen, da sonst Beschwerden über zwei davon auftreten. Ich habe meine Dateien inConfigA.cs
und umbenanntConfigB.cs
BEARBEITEN : (mit freundlicher Genehmigung von Kevin McPheat) Denken Sie beim Umbenennen der Configuration.cs-Dateien auch daran, die Klassennamen und Konstruktoren / EDIT umzubenennen
Mit dieser Struktur können Sie einfach tun
Dadurch werden die Codedateien für die Migration im Ordner neben den Konfigurationsdateien erstellt (dies ist hilfreich, um diese Dateien zusammenzuhalten).
Und last but not least wenden diese beiden Befehle die richtigen Migrationen auf die entsprechenden Datenbanken an.
EDIT 08 Feb, 2016: Ich habe ein wenig mit EF7 Version 7.0.0-rc1-16348 getestet
Ich konnte die Option -o | --outputDir nicht zum Laufen bringen. Es gab weiter
Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument
Es sieht jedoch so aus, als würde eine Migration beim ersten Hinzufügen zum Ordner "Migrationen" hinzugefügt, und eine nachfolgende Migration für einen anderen Kontext wird automatisch in einen Unterordner von Migrationen eingefügt.
Die ursprünglichen Namen
ContextA
scheinen gegen einige Namenskonventionen zu verstoßen, daher verwende ich jetztContextAContext
undContextBContext
. Unter Verwendung dieser Namen können Sie die folgenden Befehle verwenden: (Beachten Sie, dass mein dnx immer noch über die Paketmanagerkonsole funktioniert und ich kein separates CMD-Fenster öffnen möchte, um Migrationen durchzuführen.)Dadurch werden ein Modellschnappschuss und eine erste Migration im
Migrations
Ordner für erstelltContextAContext
. Es wird ein Ordner mit dem Namen erstelltContextB
, der diese Dateien für enthältContextBContext
Ich habe manuell einen
ContextA
Ordner hinzugefügt und die Migrationsdateien ausContextAContext
diesem Ordner verschoben . Dann habe ich den Namespace in diesen Dateien umbenannt (Snapshot-Datei, anfängliche Migration und beachten Sie, dass sich unter der anfänglichen Migrationsdatei eine dritte Datei befindet ... designer.cs). Ich musste.ContextA
dem Namespace etwas hinzufügen , und von dort aus behandelt das Framework es automatisch wieder.Mit den folgenden Befehlen wird für jeden Kontext eine neue Migration erstellt
und die generierten Dateien werden in den richtigen Ordnern abgelegt.
quelle
add-migration
dass Sie beim Ausführen dazu aufgefordert werdenName
. Dies warf mich leicht ab, da ich bereits zur Verfügung stellteConfigurationTypeName
und wurde leicht genervt, als es gerade sagteName:
. Aber natürlich ist der gewünschte Name die "vom Menschen lesbare" Beschreibung der Änderung - z.AddedProducts
oderIncreaseLengthOfNameFields
. Im Ordner "Migrationen" wird dies als Teil des Klassennamens angezeigt, sodass Sie leicht erkennen können, was was ist. In der TatName
ist das wie ein Check-in-Kommentar.Falls Sie bereits eine "Konfiguration" mit vielen Migrationen haben und diese unverändert lassen möchten, können Sie jederzeit eine neue "Konfigurations" -Klasse erstellen und ihr einen anderen Namen geben, z
dann geben Sie einfach den Befehl ein
und EF wird die Migration ohne Probleme durchführen. Aktualisieren Sie schließlich Ihre Datenbank. Von nun an beschwert sich EF, wenn Sie ihm nicht mitteilen, welche Konfiguration Sie aktualisieren möchten:
Getan.
Sie müssen sich nicht mit Enable-Migrations befassen, da "Configuration" bereits vorhanden ist und das Umbenennen Ihrer vorhandenen Konfigurationsklasse Probleme im Migrationsverlauf mit sich bringt.
Sie können auf verschiedene oder dieselbe Datenbank abzielen. Alle Konfigurationen teilen die __MigrationHistory-Tabelle.
quelle
Wenn weitere Datenbanken vorhanden sind, verwenden Sie die folgenden Codes in PowerShell
'Starter' ist der Migrationsname
'EnrollmentAppContext' ist der Name meines App-Kontexts
Sie können PowerShell in VS folgendermaßen öffnen:
Tools->NuGet Package Manager->Package Manager Console
quelle
So aktualisieren Sie den Datenbanktyp wie folgt: Code in PowerShell ...
* Wenn mehr als eine Datenbank vorhanden ist, verwenden Sie nur diese Codes, andernfalls nicht erforderlich.
quelle
EF 4.7 gibt tatsächlich einen Hinweis, wenn Sie Enable-Migrationen in mehreren Kontexten ausführen.
In der Assembly 'Service.Domain' wurde mehr als ein Kontexttyp gefunden.
quelle