J'ai ajouté EF 5 à mon projet via Nuget et activé les migrations avec la commande "Enable-Migrations". J'ai ensuite appelé "Add-Migration" pour générer le code de base pour générer le schéma.
J'ai ensuite ajouté une propriété à l'un de mes objets de domaine (propriété de chaîne appelée "TestProperty") et ajouté un mappage à mon fichier EntityTypeConfiguration (nous ignorons les conventions pour le moment).
Appeler à nouveau "Add-Migration" produit l'erreur:
Unable to generate an explicit migration because the following explicit migrations are pending: [201303262144218_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration.
Mais appeler "Update-Database" produit une exception sql car les tables existent déjà:
There is already an object named 'Customer' in the database
Dans mon constructeur pour mon DbContext, j'ai essayé les différentes stratégies de mise à jour, par exemple:
Database.SetInitializer<UnitOfWork>(new DropCreateDatabaseAlways<UnitOfWork>());
Suis-je en train de manquer quelque chose d'évident? J'ai essayé la solution ici mais cela n'a pas fonctionné: Migrations automatiques pour ASP.NET
Merci
EDIT: Mettre à jour La clé pour passer la première étape est de créer la migration initiale puis de supprimer le code généré des méthodes Up et Down ( http://thedatafarm.com/blog/data-access/using- ef-migrations-with-an-existing-database / ).
Je peux ensuite mettre à jour le modèle et la carte EF, puis exécuter Add-Migration. Cela génère une migration avec le code Up et Down correct.
Le problème tente alors d'appliquer la mise à jour. Update-Database génère l'erreur "Impossible de mettre à jour la base de données pour correspondre au modèle actuel car des modifications sont en attente et la migration automatique est désactivée ... migration automatique. Définissez DbMigrationsConfiguration.AutomaticMigrationsEnabled sur true pour activer la migration automatique. Vous pouvez utiliser la migration par ajout. pour écrire les modifications de modèle en attente dans une migration basée sur le code ". Ok, donc j'essaye à nouveau Add-Migration et cela produit une autre migration avec exactement le même code que le dernier.
J'exécute Update-Database et j'obtiens à nouveau la même erreur. J'essaie "Update-Database -TargetMigration 201304080859556_MyMigration -Force" mais cela produit "La migration cible spécifiée '201304080859556_MyMigration' n'existe pas. Assurez-vous que la migration cible se réfère à un identifiant de migration existant" - C'est vrai!
Très frustrant!
J'ai eu le même problème lors de l'activation des migrations EF pour un modèle code-first avec une base de données existante, et la procédure suivante a fonctionné:
__MigrationHistory
De la base de données existante.enable-migrations
À partir de la console du gestionnaire de packages.add-migration
Pour créer une migration initiale.Up()
pour la migration initiale.update-database
Pour appliquer la migration initiale à votre base de données. Cela n'apporte aucune modification aux objets existants (car la méthode Up()
ne contient aucun code), mais elle marque la base de données existante comme ayant été migrée vers l'état initial.add-migration
Pour créer une nouvelle migration. Le code de la méthode Up()
de la nouvelle migration ne contiendra que les modifications apportées à votre modèle d'objet.update-database
Pour appliquer les modifications à votre base de données.J'exécute Update-Database et j'obtiens à nouveau la même erreur. J'essaie "Update-Database -TargetMigration 201304080859556_MyMigration -Force" mais cela produit "La migration cible spécifiée '201304080859556_MyMigration' n'existe pas. Assurez-vous que la migration cible se réfère à un identifiant de migration existant" - C'est vrai!
Il y a un autre problème qui peut provoquer votre dernière erreur (et c'est peut-être une cause racine des précédentes). J'ai eu un problème similaire et il s'est avéré que pour une raison étrange, certaines de mes classes de migration se trouvaient dans un espace de noms différent de celui de ma classe MigrationConfiguration
. Correction des espaces de noms (également dans xxx.Designer.cs
files) a résolu ce problème (les migrations étaient visibles et fonctionnaient à nouveau).
Avez-vous essayé d'utiliser le paramètre - force pour appliquer les modifications.
Update-Database [-SourceMigration <String>]
[-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>]
[-StartUpProjectName <String>] [-ConfigurationTypeName <String>]
[-ConnectionStringName <String>] [<CommonParameters>]
- FORCE Spécifie que la perte de données est acceptable lors de la migration automatique de la base de données.
Vous pouvez utiliser get-help Update-Database -examples
pour voir des exemples d'utilisation.
Pour en savoir plus: EF Code First Migrations
En essayant de migrer une ancienne version de base de données vers un nouveau modèle, la base de données ne correspondait pas au nouveau modèle ou j'ai eu des erreurs comme:
Le type n'est pas résolu pour le membre 'Npgsql.PostgresException, Npgsql, Version = 3.2.2.0, Culture = neutral, PublicKeyToken = 5d8b90d52f46fda7'
Voici comment cela a fonctionné (en utilisant la migration automatique):
Définissez ces deux propriétés sur true dans le Configuration.cs nouvellement créé
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
Exécuter la mise à jour de la base de données - Force
Votre base de données sera mise à jour vers le dernier schéma et prête.
j'espère que cela t'aides.
Vous n'avez pas besoin de supprimer la migration manuellement, supprimez-la facilement avec
Remove-Migration
vous pouvez alors recréer le script de migration avec Add-Migration
.
Dans votre cas, la mise à jour de la base de données a échoué car il existe des tables existantes, déposez-les avec
Drop-Database
Ensuite vous pouvez Update-Database
.
Une utilisation plus détaillée de ces commandes est ici .
Il s'agit d'une approche globale qui fonctionne généralement:
enable-migrations -projectname yourprojectname
add-migration "Initial" -projectname yourprojectname
.update-database -projectname yourprojectname
Cela devrait faire l'affaire.