实体迁移。无法删除约束。查看以前的错误

Entity Migration. Could not drop constraint. See previous errors

这是产生此错误的代码。我已经尝试过重命名 AddForeignKey 的解决方案,但错误是相同的。

'PK_dbo.Item' is not a constraint.
Could not drop constraint. See previous errors.

你能提出一些解决方案吗?

public override void Up()
{
    DropForeignKey("dbo.AddGallery", "item_fk_id", "dbo.Item");
    DropForeignKey("dbo.ExtraFieldValue", "item_fk_id", "dbo.Item");
    DropPrimaryKey("dbo.Item");
    AddColumn("dbo.Item", "id", c => c.Int(nullable: false, identity: true));
    AddPrimaryKey("dbo.Item", "id");
    AddForeignKey("dbo.AddGallery", "item_fk_id", "dbo.Item", "id");
    AddForeignKey("dbo.ExtraFieldValue", "item_fk_id", "dbo.Item", "id");
    DropColumn("dbo.Item", "item_id");
}

public override void Down()
{
    AddColumn("dbo.Item", "item_id", c => c.Int(nullable: false, identity: true));
    DropForeignKey("dbo.ExtraFieldValue", "item_fk_id", "dbo.Item");
    DropForeignKey("dbo.AddGallery", "item_fk_id", "dbo.Item");
    DropPrimaryKey("dbo.Item");
    DropColumn("dbo.Item", "id");
    AddPrimaryKey("dbo.Item", "item_id");
    AddForeignKey("dbo.ExtraFieldValue", "item_fk_id", "dbo.Item", "id");
    AddForeignKey("dbo.AddGallery", "item_fk_id", "dbo.Item", "id");
}

我认为主键已不存在,这就是无法删除它的原因。

我找到了这个问题的解决方案。因为我试图更改现有主键名称的名称,所以在迁移时遇到错误,因为该主键被其他表引用。所以解决方案是简单地添加 [Column("id")] DataAnnotation 然后进行迁移。主键列名修改成功,没有任何错误。

在我的例子中,我使用了“代码优先于数据库”的方法。我的数据库有自己的 foreign/primary 键名,与迁移期望的键名不同。所以迁移就是找不到与这些名称的关系。我必须在删除中明确命名这些关系:

DropForeignKey(string dependentTable, string name);
DropPrimaryKey(string table, string name);

但请注意:使用这种方法,您需要显式修改 Up 和 Down 方法。这意味着,如果您不重新定义 Down() 以匹配新的 Up 方法(使用以前的 FK/PK 名称),那么如果您返回迁移,初始 Down() 将生成具有自己名称和 Up( ) 在自我修改之前需要有初始结构,除非当您再次使用 update-database 时它不会找到具有此类名称的键。