Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework Migrations can't drop table because of foreign key constraint

I have reverse-engineered the existing database to the code-first model. Some tables are to be kept but most are to be removed and completely re-architected for the new version.

I delete some old classes and their mapping and add-migration.

The migration looks like this:

  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");
        }

However when I run the migration, I get the following error in package manager console.

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

Why do I get this error when the migration should have already dropped any foreign keys prior to the drop table command? Is there any way around this?

like image 843
Dan Cook Avatar asked Jul 19 '15 11:07

Dan Cook


2 Answers

If the dbo.Bingo_Bonus table name has ever changed, or if any of the columns in the foreign key relationships have changed, EF does not rename the foreign key constraints automatically to match. I had a similar problem and I had to manually add a line like this because the DropForeignKey() function was not actually deleting the key it was supposed to:

Sql(@"ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [FK_dbo.Constraint_Name_From_Before_Table_Change]");
like image 66
Andy Raddatz Avatar answered Sep 21 '22 15:09

Andy Raddatz


You cannot drop Bingo_Bonus table, because it still has references to Bingo_Bonus_Amount and Bingo_Bonus_Type tables, changing the order in the Up() method will solve the problem

by putting :

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

before:

DropTable("dbo.Bingo_Bonus");

Your code will be:

 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");

    }
like image 25
Marouane Afroukh Avatar answered Sep 19 '22 15:09

Marouane Afroukh