2015-07-19 83 views
12

我已经将现有数据库反向工程化为代码优先模型。有些表格需要保留,但大多数表格将被删除并完全重新构建新版本。由于外键约束,实体框架迁移无法删除表

我删除了一些旧类及其映射和添加迁移。

迁移看起来是这样的:

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

然而,当我运行迁移,我得到了包管理器控制台下面的错误。

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

为什么当迁移应该在drop table命令之前删除任何外键时会出现此错误?有没有办法解决?

+0

可能是你还是忘了从任何表中删除BingoBonusID。一旦检查它可能是你会得到解决方案。 – Tonny

+0

谢谢。不过,我搜索了宾果的解决方案,唯一的参考是在我上面提供的迁移类中。 –

回答

4

不能删除Bingo_Bonus表,因为它仍然具有Bingo_Bonus_AmountBingo_Bonus_Type表的引用,在向上变化的顺序()方法就能解决问题

通过把:

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

之前:

DropTable("dbo.Bingo_Bonus"); 

您的代码将是:

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

    } 
21

如果dbo.Bingo_Bonus表名已更改,或者外键关系中的任何列已更改,则EF不会自动重命名外键约束以进行匹配。我有一个类似的问题,我不得不手动添加一行像这样因为DropForeignKey()功能实际上并没有删除这是应该的关键:

Sql(@"ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [FK_dbo.Constraint_Name_From_Before_Table_Change]"); 
+1

谢谢!不知道EF不重命名外键约束。我通过首先手动更改FK约束来解决类似的问题。 – ErazerBrecht

+7

相同但有点更好:DropForeignKey(“dbo.MyTable”,“FK_dbo.Constraint_Name_From_Before_Table_Change”); – akl22

1

我能使用GUI下降。当试图用alter运行查询时,'。'象征,是有一些错误显示

enter image description here

enter image description here

enter image description here