Entity Framework Migrations can't drop table b

2020-03-01 05:38发布

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?

4条回答
三岁会撩人
2楼-- · 2020-03-01 06:03

Use the DropForeignKey() override that takes the name of the Foreign Key.

DropForeignKey("dbo.BingoReview","dbo.FK_Constraint_Name");

And like the other responses mention, if the table has been changed, you can use the original name.

DropForeignKey("dbo.BingoReview","dbo.FK_Constraint_Name_From_Before_Table_Change");

Thanks @akl22 for providing this in a comment.

查看更多
放荡不羁爱自由
3楼-- · 2020-03-01 06:06

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]");
查看更多
冷血范
4楼-- · 2020-03-01 06:07

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

    }
查看更多
神经病院院长
5楼-- · 2020-03-01 06:20

I was able to drop using GUI. When tried to run the query with alter , the '.' symbol was having some error displayed

enter image description here

enter image description here

enter image description here

查看更多
登录 后发表回答