web-dev-qa-db-fra.com

Les migrations d'Entity Framework ne peuvent pas être supprimées en raison d'une contrainte de clé étrangère

J'ai inversé la base de données existante avec le modèle code-first. Certaines tables doivent être conservées, mais la plupart doivent être supprimées et complètement restructurées pour la nouvelle version.

Je supprime certaines anciennes classes et leur mappage et add-migration.

La migration ressemble à ceci:

  public override void Up()
        {
            DropForeignKey("dbo.Bingo_Review", "BingoID", "dbo.Bingo");
            DropForeignKey("dbo.Bingo_Review_Text", "BingoReviewID", "dbo.Bingo_Review");
            DropForeignKey("dbo.Bingo_Bonus", "BingoID", "dbo.Bingo");
            DropForeignKey("dbo.Bingo_Bonus_Amount", "BingoBonusID", "dbo.Bingo_Bonus");
            DropIndex("dbo.Bingo_Bonus", new[] { "BingoID" });
            DropIndex("dbo.Bingo_Review", new[] { "BingoID" });
            DropIndex("dbo.Bingo_Review_Text", new[] { "BingoReviewID" });
            DropIndex("dbo.Bingo_Bonus_Amount", new[] { "BingoBonusID" });
            DropTable("dbo.Bingo_Bonus");
            DropTable("dbo.Bingo");
            DropTable("dbo.Bingo_Review");
            DropTable("dbo.Bingo_Review_Text");
            DropTable("dbo.Bingo_Bonus_Amount");
            DropTable("dbo.Bingo_Bonus_Type");
        }

Cependant, lorsque j'exécute la migration, l'erreur suivante apparaît dans la console du gestionnaire de packages.

Could not drop object 'dbo.Bingo_Bonus' because it is referenced by a FOREIGN KEY constraint.

Pourquoi est-ce que je reçois cette erreur alors que la migration aurait déjà dû supprimer des clés étrangères avant la commande drop table? Y a-t-il un moyen de contourner cela?

15
Dan Cook

Si le nom de la table dbo.Bingo_Bonus a déjà changé ou si l'une des colonnes des relations de clé étrangère a été modifiée, EF ne renomme pas automatiquement les contraintes de clé étrangère pour les faire correspondre. J'ai eu un problème similaire et j'ai dû ajouter manuellement une ligne comme celle-ci car la fonction DropForeignKey() ne supprimait pas réellement la clé qu'elle était supposée:

Sql(@"ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [FK_dbo.Constraint_Name_From_Before_Table_Change]");
30
Andy Raddatz

Vous ne pouvez pas supprimer la table Bingo_Bonus, car elle contient toujours des références aux tables Bingo_Bonus_Amount et Bingo_Bonus_Type. Le fait de modifier l'ordre dans la méthode Up () résoudra le problème

en mettant :

DropTable("dbo.Bingo_Bonus_Amount");
DropTable("dbo.Bingo_Bonus_Type");

avant:

DropTable("dbo.Bingo_Bonus");

Votre code sera:

 public override void Up()
    {
        DropForeignKey("dbo.Bingo_Review", "BingoID", "dbo.Bingo");
        DropForeignKey("dbo.Bingo_Review_Text", "BingoReviewID", "dbo.Bingo_Review");
        DropForeignKey("dbo.Bingo_Bonus", "BingoID", "dbo.Bingo");
        DropForeignKey("dbo.Bingo_Bonus_Amount", "BingoBonusID", "dbo.Bingo_Bonus");
        DropIndex("dbo.Bingo_Bonus", new[] { "BingoID" });
        DropIndex("dbo.Bingo_Review", new[] { "BingoID" });
        DropIndex("dbo.Bingo_Review_Text", new[] { "BingoReviewID" });
        DropIndex("dbo.Bingo_Bonus_Amount", new[] { "BingoBonusID" });
        DropTable("dbo.Bingo_Bonus_Amount");
        DropTable("dbo.Bingo_Bonus_Type");
        DropTable("dbo.Bingo_Bonus");
        DropTable("dbo.Bingo");
        DropTable("dbo.Bingo_Review");
        DropTable("dbo.Bingo_Review_Text");

    }
4
Marouane Afroukh

J'ai pu laisser tomber en utilisant l'interface graphique. Lorsque essayé d'exécuter la requête avec alter, le '.' le symbole avait une erreur affichée

 enter image description here

 enter image description here

 enter image description here

1
Arun Prasad E S