Pourquoi ne l'Entity Framework EF Migrations Ajoutez-étape de la Migration nécessite une connexion de base de données chaîne de caractères?
Je suis en train d'utiliser et de comprendre EF Migrations (avec l'EF 4.3.1, le Premier Code). Afin d'échafauder un nouveau changement, j'ai utiliser une commande comme ceci:
Add-Migration MyMigration
-ConnectionString "Data Source=.;Initial Catalog=mydb;"
-ConnectionProviderName "System.Data.SqlClient"
-StartUpProjectName MyWebsite
-ProjectName MyEF.Migrations
Pourquoi n'Ajoutez-la Migration nécessitent des données de chaîne de connexion? Update-Database
en a besoin, qui fait sens. Mais ne pas Ajouter de la Migration ont tout ce dont il a besoin à partir de la DbContext et la Configuration?
Il n'est pas de la demande ralenti, c'est très difficile de donner une base de données, parce que nous avons un "multi-tenant" chose où la base de données souhaitée est flexible et peut changer à partir de la demande à la demande, a fortiori au moment de la compilation statique. Donc, si Add-Migration
est fait à l'AIDE de cette base de données pour rien, nous avons un problème.
Mise à JOUR: Nous avons donné sur l'EF Migrations et utilisez Couramment Migrator au lieu de cela, et ils sont heureux. C'est beaucoup, beaucoup plus rapide, même en comptant le fait que nous avons à écrire des choses deux fois (une fois pour l'EF objet et une fois pour la Migration), et il n'a pas les problèmes évoqués dans la présente question.
Vous devez vous connecter pour publier un commentaire.
Add-Migration
vérifie l'existence de la base de données et interagit avec__MigrationHistory
table. Comme @Anders Abel mentionné, il est utilisé pour l'étude de l'attente de migrations et afin de choisir le modèle précédent de trouver réellement ce qui a changé - c'est particulièrement important si vous ajoutez explicite de la migration dans la solution où les migrations automatiques sont activées.Je me suis curieux lors de la lecture de votre question, donc j'ai tiré un générateur de profils Sql Server pour avoir un coup d'oeil à ce qui se passe lorsque vous ajoutez-la migration est exécuté. Il n'a en effet se connecter à la base de données et avoir accès à la DB pour vérifier la
__MigrationHistory
table.C'est aussi indiqué par le message d'erreur produite lors de la tentative de créer une seconde base de code de la migration, sans courir le premier:
Je pense que les migrations moteur utilise la sérialisé modèle à partir de la base de données pour le calcul de ce que les étapes de migration devrait être inclus dans la nouvelle migration.
Comme je le comprends, la base de données est utilisé uniquement comme une aide pour la génération de code. Tant que les différentes bases de données que vous utilisez sont compatibles avec le modèle dans le code, cela ne devrait pas être un problème pour votre.
Modifier
Comme @Ladislav Mrnka points, un chèque avec la base de données est requis si le mélange à base de code et les migrations automatiques. Lorsque vous échafaudage en place d'une nouvelle migration, elle doit inclure tout ce qui a changé dans votre modèle depuis la dernière migration. Si vous utilisez les migrations automatiques, ceux qui ne sont pas suivis dans le code. Lors du calcul de ce que les changements à inclure dans la migration, le dernier terme, la migration est utilisé comme une base. Le seul moyen de vérifier qui est à la base de données depuis les migrations automatiques peut être activée.
Si vous êtes en cours d'exécution avec une seule base de code migrations (qui je pense est la seule option pour garder le contrôle), alors que la base de données peut être considérée comme une simple génération de code à l'aide. Aussi longtemps que le modèle de compatibilité est assurée dans toutes les bases de données que vous vous connectez à, tout devrait fonctionner.
AutomaticMigrationsEnabled
à faux, comment cette analyse du changement? (Je pense que je pourrais vivre dans un automatique-migration-gratuit monde si je n'avais pas à spécifier les bases de données de plus.)OP a écrit:
Pas comme d'autres l'ont mentionné ici, le Concepteur de la partie du code pour une Migration Manuelle (ce qui est créé par
add-migration
) contient un instantané de votre schéma de base de données.Cela dit, le fait que vous utilisez une chaîne de connexion etc est très étrange. EF implique normalement à partir de votre DbContext classe(s) et le Web.Config. Dans un projet où j'ai une base de données unique et d'un seul DbContext, j'ai créer une classe de Configuration et ajouter une migration manuelle avec:
Je n'ai pas à passer d'autres arguments de ligne de commande. C'est en EF 4.3.1 - peut-être vous étiez à l'aide d'un CTP ou certaines anciennes version, ou tout simplement mal compris la doc?
Si j'ai plusieurs DBs ou DbContexts, puis-je avoir plusieurs classes de Configuration et d'utiliser, par exemple:
Qui utilise ma classe de Configuration et connexes de la chaîne de connexion dans le Web.config pour ajouter une migration manuelle de la base de données/DbContext.
Voici un plus exemple de code d'un simple DbContext destiné à stocker les logs (séparée de la principale db):
Dans Le Web.Config:
Donc dans cet exemple, j'ai plusieurs bases de données, de multiples DbContexts. Le LogDb utilise une autre chaîne de connexion dans le Web.Config basée sur la question de savoir DBDEPLOY" est défini au moment de la compilation; si elle est, il utilise des "LogDeploy." Si non, il utilise la valeur par défaut - la chaîne de connexion avec le même nom que la classe, "LogDb." Cela me permet de déployer facilement DB changements à un serveur à partir de mon ordinateur local, par le changement de mon Projet de Configuration, ouvrir un port sur le SQL db machine, et en cours d'exécution:
dans le Gestionnaire de paquets de la Console.
J'ai regardé cette vidéo par Rowan Miller à partir de mars 2014: Migrations - Sous le Capot
Dans la vidéo Rowan explique que le
Add-Migration
commande effectue en plusieurs étapes qui comprennent un composant appeléEdmModelDiffer
.Le
EdmModelDiffer
compare le modèle actuel avec un modèle précédent de la dernière migration (qui est intégré dans le fichier resx de la migration précédente) et calcule ensuite les modifications nécessaires de la base de données.De sorte que le
EdmModelDiffer
composant a besoin de la connexion de base de données.Les étapes décrites dans la vidéo sont:
EdmModelDiffer
)Théoriquement, on peut penser que il suffit de comparer ce modèle actuel vers le modèle de la dernière migration pour générer la nouvelle migration.
Mais entre temps, d'autres personnes pourraient avoir effectué des modifications dans la base de données trop. C'est sans doute pourquoi il y a également un chèque à l'encontre de la base de données.
Sans cela, le fichier de migration n'aurait pas besoin d'être correct.
Jetez également un coup d'oeil à la deuxième vidéo, appelée Migrations - Des Environnements D'Équipe