Plusieurs contextes de base de données dans la même base de données et la même application dans EF 6 et migrations Code First

94

Je suis nouveau dans Entity Framework. J'essaie de configurer une application MVC qui utilise EF 6. J'utilise Code First Migrations. J'utilise Areas dans l'application et j'aimerais avoir différents DbContexts dans chaque zone pour la décomposer. Je sais qu'EF 6 a ContextKey, mais je ne trouve pas d'informations complètes sur la façon de l'utiliser. Actuellement, je ne peux utiliser les migrations que dans un contexte à la fois.

Quelqu'un peut-il donner un exemple suffisamment détaillé pour qu'une nouvelle personne comme moi puisse comprendre et utiliser.

Lrayh
la source

Réponses:

176

Entity Framework 6 a ajouté la prise en charge de plusieurs DbContexts en ajoutant les indicateurs -ContextTypeNameet -MigrationsDirectory. J'ai juste exécuté les commandes dans ma console du gestionnaire de package et collé la sortie ci-dessous ...

Si vous avez 2 DbContexts dans votre projet et que vous exécutez enable-migrations, vous obtiendrez une erreur (comme vous le savez probablement déjà):

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.

Vous devez donc exécuter enable-migrationschacun DbContextséparément. Et vous devez spécifier un dossier pour chaque Configuration.csfichier à générer ...

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.

Pour ajouter des migrations pour chacun DbContext, procédez comme suit en spécifiant le nom complet de la Configurationclasse:

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.

Et vous exécutez de update-databasela même manière:

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.

J'espère que cela t'aides.

Anthony Chu
la source
Dois-je avoir une chaîne de connexion distincte pour chaque contexte ou existe-t-il un moyen de contourner cela?
Lrayh le
3
Ils peuvent partager la même chaîne de connexion. Mais vous voulez vous assurer qu'ils ne correspondent pas aux mêmes tables.
Anthony Chu le
S'ils correspondent à la même table, vous pouvez toujours définir la migration qui s'exécutera en premier, et laisser son fichier de migration créer la table, et laquelle s'exécutera en second, et la modifier afin qu'elle ne crée pas la table déjà existante. Vous pouvez ensuite utiliser MigrateDatabaseToLatestVersionforzing the ctx.Database.initialize()de chaque contexte pour exécuter dans le bon ordre, ou exécuter la Update-Databasecommande à la main dans le bon ordre. (Et l'inverse, si vous effectuez une migration de base de données vers la version précédente). C'est "dangereux" mais peut être fait.
JotaBe
J'avais donc ajouté des migrations à mon projet et créé un contexte différent de ApplicationDbContext. J'ai continué à utiliser ce contexte qui était des données liées au site pendant environ 6 mois, puis il est venu le temps de commencer à jouer avec mon ApplicationUser. Ma connexion et mon inscription de base fonctionnaient, mais je voulais étendre la classe d'utilisateurs pour ajouter des champs supplémentaires. Cette réponse a été très utile pour configurer une nouvelle configuration de migration pour ce contexte. Je vous remercie! # 1up
Eric Bishard
1
si je peux vous donner un +10 pour cette réponse courte mais plus que suffisante, je le ferais, merci @AnthonyChu.
Karim AG