Mehrere DB-Kontexte in derselben DB und Anwendung in EF 6 und Code First Migrations

94

Ich bin neu bei Entity Framework. Ich versuche, eine MVC-Anwendung einzurichten, die EF 6 verwendet. Ich verwende Code First Migrations. Ich verwende Bereiche in der App und möchte in jedem Bereich unterschiedliche DbContexts haben, um sie aufzuteilen. Ich weiß, dass EF 6 über ContextKey verfügt, kann jedoch keine vollständigen Informationen zur Verwendung finden. Derzeit kann ich Migrationen jeweils nur für einen Kontext verwenden.

Kann jemand ein Beispiel mit genügend Details geben, damit EF wie ich eine neue Person verstehen und verwenden kann?

Lrayh
quelle

Antworten:

176

Entity Framework 6 fügte Unterstützung für mehrere DbContexts hinzu, indem die Flags -ContextTypeNameund hinzugefügt wurden -MigrationsDirectory. Ich habe gerade die Befehle in meiner Package Manager-Konsole ausgeführt und die folgende Ausgabe eingefügt ...

Wenn Sie 2 DbContextSekunden in Ihrem Projekt haben und ausführen enable-migrations, wird eine Fehlermeldung angezeigt (wie Sie wahrscheinlich bereits wissen):

PM> enable-migrations
More than one context type was found in the assembly 'WebApplication3'.
To enable migrations for 'WebApplication3.Models.ApplicationDbContext', use Enable-Migrations -ContextTypeName WebApplication3.Models.ApplicationDbContext.
To enable migrations for 'WebApplication3.Models.AnotherDbContext', use Enable-Migrations -ContextTypeName WebApplication3.Models.AnotherDbContext.

Sie müssen also enable-migrationsjeweils DbContexteinzeln laufen . Und Sie müssen für jede Configuration.cszu generierende Datei einen Ordner angeben ...

PM> Enable-Migrations -ContextTypeName ApplicationDbContext -MigrationsDirectory Migrations\ApplicationDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

PM> Enable-Migrations -ContextTypeName AnotherDbContext -MigrationsDirectory Migrations\AnotherDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

Um Migrationen für jede hinzuzufügen DbContext, gehen Sie folgendermaßen vor, indem Sie den vollständig qualifizierten Namen der ConfigurationKlasse angeben:

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

Und du rennst update-databasegenauso:

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113124_InitialDatabaseCreation].
Applying explicit migration: 201402032113124_InitialDatabaseCreation.
Running Seed method.

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113383_InitialDatabaseCreation].
Applying explicit migration: 201402032113383_InitialDatabaseCreation.
Running Seed method.

Hoffe das hilft.

Anthony Chu
quelle
Muss ich für jeden Kontext eine eigene Verbindungszeichenfolge haben oder gibt es einen Weg, dies zu umgehen?
Lrayh
3
Sie können dieselbe Verbindungszeichenfolge verwenden. Sie möchten jedoch sicherstellen, dass sie nicht denselben Tabellen zugeordnet sind.
Anthony Chu
Wenn sie derselben Tabelle zugeordnet sind, können Sie weiterhin definieren, welche Migration zuerst ausgeführt wird, und die Migrationsdatei verlassen, die Tabelle erstellen und welche als zweite ausführen, und sie so ändern, dass die bereits vorhandene Tabelle nicht erstellt wird. Sie können dann das MigrateDatabaseToLatestVersionEinfrieren der ctx.Database.initialize()einzelnen Kontexte verwenden, um sie in der richtigen Reihenfolge auszuführen, oder den Update-DatabaseBefehl von Hand in der richtigen Reihenfolge ausführen. (Und umgekehrt, wenn Sie eine Datenbankmigration zur vorherigen Version durchführen). Es ist "gefährlich" , kann aber gemacht werden.
JotaBe
Daher hatte ich meinem Projekt Migrationen hinzugefügt und einen anderen Kontext als ApplicationDbContext erstellt. Ich fuhr fort, diesen Kontext zu verwenden, der Site-bezogene Daten für ungefähr 6 Monate war, dann wurde es Zeit, mit meinem ApplicationUser herumzuspielen. Meine grundlegende Anmeldung und Registrierung funktionierte, aber ich wollte die Benutzerklasse erweitern, um einige zusätzliche Felder hinzuzufügen. Diese Antwort war sehr hilfreich beim Einrichten einer neuen Migrationskonfiguration für diesen Kontext. Danke dir! # 1up
Eric Bishard
1
Wenn ich Ihnen eine +10 für diese kurze, aber mehr als genug Antwort geben kann, würde ich Danke @AnthonyChu.
Karim AG