Comment activer les migrations Entity Framework 5 (version 5.0.0) pour plusieurs contextes de base de données dans le même projet, où chaque contexte correspond à sa propre base de données? Lorsque j'exécute Enable-Migrations
dans la console PM (Visual Studio 2012), il y a une erreur en raison de l'existence de plusieurs contextes:
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.
Si je cours, Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext
je ne suis pas autorisé à courir Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext
car une migration existe déjà:Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.
Réponses:
Le deuxième appel à Enable-Migrations échoue car le fichier Configuration.cs existe déjà. Si vous renommez cette classe et ce fichier, vous devriez être en mesure d'exécuter ce 2nd Enable-Migrations, ce qui créera un autre Configuration.cs.
Vous devrez ensuite spécifier la configuration que vous souhaitez utiliser lors de la mise à jour des bases de données.
la source
En plus de ce que @ckal a suggéré, il est essentiel de donner à chaque Configuration.cs renommée son propre espace de noms. Si vous ne le faites pas, EF tentera d'appliquer les migrations au mauvais contexte.
Voici les étapes spécifiques qui fonctionnent bien pour moi.
Si les migrations sont interrompues et que vous souhaitez créer une nouvelle «ligne de base»:
Création de la migration initiale:
Dans la console du gestionnaire de package:
Dans l'Explorateur de solutions: renommez Migrations.Configuration.cs en Migrations.ConfigurationA.cs. Cela devrait automatiquement renommer le constructeur si vous utilisez Visual Studio. Assurez-vous que c'est le cas. Modifier ConfigurationA.cs: remplacez l'espace de noms par NamespaceOfContext.Migrations.MigrationsA
Dans l'Explorateur de solutions: renommez Migrations.Configuration.cs en Migrations.ConfigurationB.cs. Encore une fois, assurez-vous que le constructeur est également renommé de manière appropriée. Modifier la configurationB.cs: remplacez l'espace de noms par NamespaceOfContext.Migrations.MigrationsB
Étapes pour créer des scripts de migration dans la console du gestionnaire de package:
Exécuter la commande
ou -
Il est possible de réexécuter cette commande jusqu'à ce que les modifications soient appliquées à la base de données.
Exécutez les scripts sur la base de données locale souhaitée ou exécutez Update-Database sans -Script pour appliquer localement:
ou -
la source
Je viens de tomber sur le même problème et j'ai utilisé la solution suivante (tout à partir de la console du gestionnaire de package)
Cela créera 2 dossiers séparés dans le dossier Migrations. Chacun contiendra le
Configuration.cs
fichier généré . Malheureusement, vous devez toujours renommer cesConfiguration.cs
fichiers, sinon il y aura des plaintes à propos de deux d'entre eux. J'ai renommé mes fichiers enConfigA.cs
etConfigB.cs
EDIT : (avec la permission de Kevin McPheat) N'oubliez pas lorsque vous renommez les fichiers Configuration.cs, renommez également les noms de classe et les constructeurs / EDIT
Avec cette structure, vous pouvez simplement faire
Ce qui créera les fichiers de code pour la migration dans le dossier à côté des fichiers de configuration (c'est bien de garder ces fichiers ensemble)
Enfin, ces deux commandes appliqueront les migrations correctes à leurs bases de données correspondantes.
EDIT 08 février 2016: J'ai fait un petit test avec EF7 version 7.0.0-rc1-16348
Je n'ai pas pu faire fonctionner l'option -o | --outputDir. Il a continué à donner
Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument
Cependant, il semble que la première fois qu'une migration est ajoutée, elle est ajoutée dans le dossier Migrations, et une migration ultérieure pour un autre contexte est automatiquement placée dans un sous-dossier de migrations.
Les noms originaux
ContextA
semblent enfreindre certaines conventions de dénomination, j'utilise maintenantContextAContext
etContextBContext
. En utilisant ces noms, vous pouvez utiliser les commandes suivantes: (notez que mon dnx fonctionne toujours à partir de la console du gestionnaire de packages et que je n'aime pas ouvrir une fenêtre CMD séparée pour faire des migrations)Cela créera un instantané du modèle et une migration initiale dans le
Migrations
dossier pourContextAContext
. Il créera un dossier nomméContextB
contenant ces fichiers pourContextBContext
J'ai ajouté manuellement un
ContextA
dossier et déplacé les fichiers de migration depuisContextAContext
ce dossier. Ensuite, j'ai renommé l'espace de noms à l'intérieur de ces fichiers (fichier instantané, migration initiale et note qu'il y a un troisième fichier sous le fichier de migration initial ... designer.cs). J'ai dû ajouter.ContextA
à l'espace de noms, et à partir de là, le framework le gère à nouveau automatiquement.L'utilisation des commandes suivantes créerait une nouvelle migration pour chaque contexte
et les fichiers générés sont placés dans les bons dossiers.
la source
add-migration
il vous demanderaName
. Cela m'a légèrement déconcerté car je fournissais déjàConfigurationTypeName
et j'ai été légèrement ennuyé quand il vient de le direName:
. Mais bien sûr, le nom qu'il veut est la description «lisible par l'homme» du changement - par exemple.AddedProducts
ouIncreaseLengthOfNameFields
. Dans le dossier Migrations, vous l'obtiendrez dans le cadre du nom de la classe afin qu'il soit facile de voir ce qui est quoi. Donc, en fait,Name
c'est un peu comme un commentaire d'enregistrement.Si vous avez déjà une "Configuration" avec de nombreuses migrations et que vous souhaitez la conserver telle quelle, vous pouvez toujours créer une nouvelle classe "Configuration", lui donner un autre nom, comme
alors émettez simplement la commande
et EF échafaudera la migration sans problème. Enfin, mettez à jour votre base de données, à partir de maintenant, EF se plaindra si vous ne lui dites pas quelle configuration vous souhaitez mettre à jour:
Terminé.
Vous n'avez pas besoin de traiter Enable-Migrations car il se plaindra que "Configuration" existe déjà, et renommer votre classe de configuration existante entraînera des problèmes dans l'historique de migration.
Vous pouvez cibler différentes bases de données, ou la même, toutes les configurations partageront bien la table __MigrationHistory.
la source
Si plusieurs bases de données existent, utilisez les codes suivants dans PowerShell
«Starter» est le nom de la migration
'EnrollmentAppContext' est le nom de mon contexte d'application
Vous pouvez ouvrir PowerShell dans VS en faisant:
Tools->NuGet Package Manager->Package Manager Console
la source
Pour mettre à jour le type de base de données en suivant les codes dans PowerShell ...
* s'il existe plus d'une base de données, utilisez uniquement ces codes, sinon pas nécessaire.
la source
EF 4.7 donne en fait un indice lorsque vous exécutez Enable-migrations à plusieurs contextes.
Plus d'un type de contexte a été trouvé dans l'assembly «Service.Domain».
la source