it-swarm.com.de

Wie aktiviere ich EF-Migrationen für mehrere Kontexte, um Datenbanken zu trennen?

Wie aktiviere ich Entity Framework 5 (Version 5.0.0) -Migrationen für mehrere DB-Kontexte in demselben Projekt, wobei jeder Kontext seiner eigenen Datenbank entspricht? Wenn ich Enable-Migrations In der PM Konsole (Visual Studio 2012) ist ein Fehler aufgetreten, 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 Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext Ich darf nicht rennen 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.

116
aknuds1

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, die 2nd Enable-Migrations 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.

Update-Database -ConfigurationTypeName MyRenamedConfiguration
123
ckal

Zusätzlich zu dem, was @ckal vorgeschlagen hat, ist es kritisch, jeder umbenannten Configuration.cs einen eigenen Namespace 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:

  1. Löschen Sie alle vorhandenen CS-Dateien im Ordner "Migrations"
  2. Löschen Sie in SSMS die Systemtabelle __MigrationHistory.

So erstellen Sie die Erstmigration:

  1. In der Package Manager-Konsole:

    Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextA
    
  2. Im Projektmappen-Explorer: Benennen Sie Migrations.Configuration.cs in Migrations.ConfigurationA.cs um. Dadurch sollte der Konstruktor bei Verwendung von Visual Studio automatisch umbenannt werden. Stellen Sie sicher, dass dies der Fall ist. Edit ConfigurationA.cs: Ändern Sie den Namespace in NamespaceOfContext.Migrations.MigrationsA

  3. Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB
    
  4. Im Projektmappen-Explorer: Benennen Sie Migrations.Configuration.cs in Migrations.ConfigurationB.cs um. Stellen Sie erneut sicher, dass der Konstruktor auch entsprechend umbenannt wird. Edit ConfigurationB.cs: Ändern Sie den Namespace in NamespaceOfContext.Migrations.MigrationsB

  5. add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB 
    
  6. Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    
  7. add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName
    NameOfMainProject  -ConnectionStringName ContextA 
    
  8. Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

Schritte zum Erstellen von Migrationsskripten in Package Manager Console:

  1. Führen Sie den Befehl aus

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

    oder -

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    

    Es ist in Ordnung, diesen Befehl erneut auszuführen, bis Änderungen an der Datenbank vorgenommen wurden.

  2. Führen Sie die Skripte entweder für die gewünschte lokale Datenbank aus oder führen Sie Update-Database ohne -Script aus, um sie lokal anzuwenden:

    Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

    oder -

    Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    
95
Eric J.

Ich bin gerade auf dasselbe Problem gestoßen und habe die folgende Lösung verwendet (alles von Package Manager Console)

PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextA" -ContextTypeName MyProject.Models.ContextA
PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextB" -ContextTypeName MyProject.Models.ContextB

Dadurch werden 2 separate Ordner im Migrationsordner erstellt. Jede enthält die generierte Configuration.cs - Datei. Leider müssen Sie diese Configuration.cs - Dateien noch umbenennen, da sonst Beschwerden über zwei von ihnen auftreten. Ich habe meine Dateien in ConfigA.cs Und ConfigB.cs Umbenannt

EDIT : (mit freundlicher Genehmigung von Kevin McPheat) Denken Sie beim Umbenennen der Configuration.cs-Dateien daran, auch die Klassennamen und Konstruktoren umzubenennen / EDIT

Mit dieser Struktur können Sie einfach tun

PM> Add-Migration -ConfigurationTypeName ConfigA
PM> Add-Migration -ConfigurationTypeName ConfigB

Welches wird die Code-Dateien für die Migration im Ordner neben den Konfigurationsdateien erstellen (das ist schön, um diese Dateien zusammen zu halten)

PM> Update-Database -ConfigurationTypeName ConfigA
PM> Update-Database -ConfigurationTypeName ConfigB

Und zu guter Letzt werden diese beiden Befehle die richtigen Migrationen auf die entsprechenden Datenbanken anwenden.

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 immer wieder Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument

Es sieht jedoch so aus, als würde eine Migration, wenn sie zum ersten Mal hinzugefügt wird, dem Migrationsordner hinzugefügt, und eine nachfolgende Migration für einen anderen Kontext wird automatisch in einen Unterordner von Migrationen verschoben.

Die ursprünglichen Namen ContextA scheinen gegen einige Namenskonventionen zu verstoßen, daher verwende ich jetzt ContextAContext und ContextBContext. Mit diesen 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.)

PM> dnx ef migrations add Initial -c "ContextAContext"
PM> dnx ef migrations add Initial -c "ContextBContext"

Dies erstellt einen Modellschnappschuss und eine anfängliche Migration im Ordner Migrations für ContextAContext. Es wird ein Ordner mit dem Namen ContextB erstellt, der diese Dateien für ContextBContext enthält.

Ich habe manuell einen Ordner ContextA hinzugefügt und die Migrationsdateien von ContextAContext in diesen Ordner verschoben. Dann habe ich den Namespace in diesen Dateien umbenannt (Snapshot-Datei, anfängliche Migration und beachte, dass es eine dritte Datei unter der anfänglichen Migrationsdatei gibt ... designer.cs). Ich musste .ContextA Zum Namespace hinzufügen, und von dort aus behandelt das Framework es wieder automatisch.

Mit den folgenden Befehlen wird für jeden Kontext eine neue Migration erstellt

PM>  dnx ef migrations add Update1 -c "ContextAContext"
PM>  dnx ef migrations add Update1 -c "ContextBContext"

und die erzeugten Dateien werden in die richtigen Ordner abgelegt.

73
bart s

Falls Sie bereits eine "Konfiguration" mit vielen Migrationen haben und diese beibehalten möchten, können Sie jederzeit eine neue "Konfiguration" -Klasse erstellen und ihr einen anderen Namen geben, z

class MyNewContextConfiguration : DbMigrationsConfiguration<MyNewDbContext>
{
   ...
}

geben Sie dann einfach den Befehl aus

Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName

und EF wird die Migration problemlos durchführen. Zum Schluss aktualisieren Sie Ihre Datenbank. Von nun an wird EF sich beschweren, wenn Sie ihm nicht mitteilen, welche Konfiguration Sie aktualisieren möchten:

Update-Database -ConfigurationTypeName MyNewContextConfiguration 

Getan.

Sie müssen sich nicht mit Enable-Migrations befassen, da die Meldung angezeigt wird, dass "Configuration" bereits vorhanden ist, und das Umbenennen der vorhandenen Configuration-Klasse führt zu Problemen im Migrationsverlauf.

Sie können unterschiedliche Datenbanken oder dieselbe Datenbank als Ziel verwenden. Alle Konfigurationen teilen die Tabelle __MigrationHistory.

7

Wenn weitere Datenbanken vorhanden sind, verwenden Sie die folgenden Codes in PowerShell

Add-Migration Starter -context EnrollmentAppContext 
  • "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

1
AHAMED AAQIB

Um die Datenbank zu aktualisieren, geben Sie folgende Codes in PowerShell ein ...

Update-Database -context EnrollmentAppContext

* Wenn mehr als eine Datenbank vorhanden ist, verwenden Sie nur diese Codes, ansonsten nicht erforderlich.

0
AHAMED AAQIB