web-dev-qa-db-fra.com

Migrations de code Framework d'entité - coincé lors de la migration initiale

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!

19
SturmUndDrang

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é:

  1. Supprimez le dossier Migrations existant dans votre projet et supprimez la table __MigrationHistory De la base de données existante.
  2. Exécutez la commande enable-migrations À partir de la console du gestionnaire de packages.
  3. Exécutez la commande add-migration Pour créer une migration initiale.
  4. Supprimez tout le code de la méthode Up() pour la migration initiale.
  5. Exécutez la commande 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.
  6. Apportez des modifications à votre modèle code-first.
  7. Exécutez la commande 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.
  8. Exécutez la commande update-database Pour appliquer les modifications à votre base de données.
22
MrUpsideDown

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).

7
Łukasz Wiatrak

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

3
Matija Grcic

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):

  1. Supprimer le dossier Migrations
  2. Exécuter des migrations d'activation
  3. Définissez ces deux propriétés sur true dans le Configuration.cs nouvellement créé

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
    
  4. 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.

0
Chtiwi Malek

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 .

0
Chayapol

Il s'agit d'une approche globale qui fonctionne généralement:

  1. Supprimez l'intégralité de votre dossier Migrations (assurez-vous de copier tout code que vous pourriez avoir créé à partir de la méthode de départ dans votre fichier de configuration de migration).
  2. Supprimez la base de données réelle. Si vous utilisez LocalDb, cela se trouvera normalement dans votre dossier de solution AppData (clic droit -> emplacement du dossier ouvert). Assurez-vous de supprimer les fichiers de base de données .mdf et .log.
  3. Accédez à Package Manager Console. Entrer enable-migrations -projectname yourprojectname
  4. Accédez à Package Manager Console. Entrer add-migration "Initial" -projectname yourprojectname.
  5. Ouvrez le fichier de configuration de la migration et collez le code que vous avez copié à partir de l'étape 1 dans la méthode de départ.
  6. Accédez à Package Manager Console. Entrer update-database -projectname yourprojectname

Cela devrait faire l'affaire.

0
user3083619