实体迁移。无法删除约束。查看以前的错误
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 时它不会找到具有此类名称的键。
这是产生此错误的代码。我已经尝试过重命名 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 时它不会找到具有此类名称的键。