我已将现有数据库反向设计为代码优先模型。一些表将被保留,但大多数表将被删除并完全重新构建为新版本。
我删除了一些旧类及其映射和添加迁移。
迁移看起来像这样:
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命令之前删除了任何外键时出现此错误?有没有办法解决这个问题?
答案 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_Amount
和Bingo_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)