由于外键约束,实体框架迁移不能删除表

时间:2015-07-19 11:38:07

标签: entity-framework ef-migrations

我已将现有数据库反向设计为代码优先模型。一些表将被保留,但大多数表将被删除并完全重新构建为新版本。

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

迁移看起来像这样:

int main()
{
int a[] = {11, 22, 33, 44, 55}, *p, k;
printf("a = %p\n", a);
p = a;
for(k=0; k<5; k++)
    {
    printf("%d %p %p %d %d\n", k, &a[k], p, a[k], *p);
    p++;
    }
}

但是,当我运行迁移时,我在包管理器控制台中收到以下错误。

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

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

4 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:6)

您不能删除Bingo_Bonus表,因为它仍然引用了Bingo_Bonus_AmountBingo_Bonus_Type表,更改Up()方法中的顺序将解决问题

通过推荐:

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

    }

答案 2 :(得分:2)

使用带有外键名称的DropForeignKey()替代。

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

和其他答复一样,如果表已更改,则可以使用原始名称。

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

感谢@ akl22在评论中提供此内容。

答案 3 :(得分:1)

我能够使用GUI删除。当尝试使用alter运行查询时,'。'符号显示有一些错误

enter image description here

enter image description here

enter image description here