2014-05-06 96 views
1

我创建了一些新表,我注意到我没有使用好的命名约定的ID。无法更新数据库,因为实体无法删除约束

所以我做了一个新的add-migration与新的ID,但是当我尝试update-database我有以下错误:

“PK_dbo.DB_User_Type”是由表 “AspNetUsers”引用的约束,外键约束 'FK_dbo.AspNetUsers_dbo.DB_User_Type_DB_User_Type_Id'。无法下降 约束。查看以前的错误。

我不明白,因为脚本以删除所有约束开始。

有人可以解释一下如何解决这个错误吗?

我正在使用实体6.1的新方法code first from an existing database。这里是Up功能

public override void Up() 
     { 
      DropForeignKey("dbo.DB_Company_Profile", "DB_Category_Id", "dbo.DB_Category"); 
      DropForeignKey("dbo.DB_Category_Translation", "DB_Category_Id", "dbo.DB_Category"); 
      DropForeignKey("dbo.DB_User_Type_Translation", "DB_User_Type_Id", "dbo.DB_User_Type"); 
      DropForeignKey("dbo.DB_Company_Profile", "category_id", "dbo.DB_Category"); 
      DropForeignKey("dbo.DB_Category_Translation", "category_id", "dbo.DB_Category"); 
      DropForeignKey("dbo.AspNetUsers", "DB_User_Type_user_type_id", "dbo.DB_User_Type"); 
      DropForeignKey("dbo.DB_User_Type_Translation", "user_type_id", "dbo.DB_User_Type"); 
      DropIndex("dbo.DB_Company_Profile", new[] { "DB_Category_Id" }); 
      DropIndex("dbo.DB_Category_Translation", new[] { "DB_Category_Id" }); 
      DropIndex("dbo.DB_User_Type_Translation", new[] { "DB_User_Type_Id" }); 
      DropColumn("dbo.DB_Company_Profile", "category_id"); 
      DropColumn("dbo.DB_Category_Translation", "category_id"); 
      DropColumn("dbo.DB_User_Type_Translation", "user_type_id"); 
      RenameColumn(table: "dbo.AspNetUsers", name: "DB_User_Type_Id", newName: "DB_User_Type_user_type_id"); 
      RenameColumn(table: "dbo.DB_Company_Profile", name: "DB_Category_Id", newName: "category_id"); 
      RenameColumn(table: "dbo.DB_Category_Translation", name: "DB_Category_Id", newName: "category_id"); 
      RenameColumn(table: "dbo.DB_User_Type_Translation", name: "DB_User_Type_Id", newName: "user_type_id"); 
      RenameIndex(table: "dbo.AspNetUsers", name: "IX_DB_User_Type_Id", newName: "IX_DB_User_Type_user_type_id"); 
      DropPrimaryKey("dbo.DB_Category"); 
      DropPrimaryKey("dbo.DB_User_Type"); 
      AddColumn("dbo.DB_Category", "category_id", c => c.Int(nullable: false, identity: true)); 
      AddColumn("dbo.DB_User_Type", "user_type_id", c => c.Int(nullable: false, identity: true)); 
      AlterColumn("dbo.DB_Company_Profile", "category_id", c => c.Int(nullable: false)); 
      AlterColumn("dbo.DB_Category_Translation", "category_id", c => c.Int(nullable: false)); 
      AlterColumn("dbo.DB_User_Type_Translation", "user_type_id", c => c.Int(nullable: false)); 
      AddPrimaryKey("dbo.DB_Category", "category_id"); 
      AddPrimaryKey("dbo.DB_User_Type", "user_type_id"); 
      CreateIndex("dbo.DB_Company_Profile", "category_id"); 
      CreateIndex("dbo.DB_Category_Translation", "category_id"); 
      CreateIndex("dbo.DB_User_Type_Translation", "user_type_id"); 
      AddForeignKey("dbo.DB_Company_Profile", "category_id", "dbo.DB_Category", "category_id", cascadeDelete: true); 
      AddForeignKey("dbo.DB_Category_Translation", "category_id", "dbo.DB_Category", "category_id", cascadeDelete: true); 
      AddForeignKey("dbo.DB_User_Type_Translation", "user_type_id", "dbo.DB_User_Type", "user_type_id", cascadeDelete: true); 
      AddForeignKey("dbo.AspNetUsers", "DB_User_Type_user_type_id", "dbo.DB_User_Type", "user_type_id"); 
      DropColumn("dbo.DB_Category", "Id"); 
      DropColumn("dbo.DB_User_Type", "Id"); 
     } 
+0

如果你没有数据,最干净的方法是删除DB> – DarthVader

+0

然后它说它不存在。我想我不得不做另外一些比更新数据库 – Marc

+0

我想我可以针对另一个迁移,但我想知道是否有一些不那么复杂 – Marc

回答

0

嗯,大概有外键的一些规则 - 他们中的一些是为了处理这种情况,当您尝试删除具有与之相关联的另一个记录的记录。 就你而言,你似乎想要将CASCADE规则应用于你的关系。这样的实体将删除所有FKS

+0

我有这个错误是否正常,那么如果没有数据? – Marc

+0

你能提供一个实体的例子吗? – Marc

+0

为了执行CASCADE,您需要修改建立PK-FK关系的表。你需要修改约束本身。 – Andrew

-1
  1. DropForeignKey( “dependantTable”, “dependantColumn”, “principalTable”)
  2. DropPrimaryKey( “principalTable”)
  3. AddPrimaryKey( “principalTable”, “principalColumn” )
  4. AddForeignKey( “dependantTable”, “dependantColumn”, “principalTable”)
0

我有同样的问题。 This post helped me.

问题是EF没有自动重命名我的FK_CONSTRAINST。因此DropForeignKey()不正确。你可以通过手动SQL查询来解决这个问题(查看上面的帖子)。但我通过首先在数据库中手动更改FK_CONSTRAINST来解决此问题。请记住,您可以使用-Verbose检查查询。它更容易调试。

0

我必须在运行update-database命令之前手动删除外键。因为我的数据库中的约束名称像'FK_dbo.AspNetUsers_dbo.DB_User_Type_DB_User_TypeId'一样存在。
尽管脚本尝试删除的约束为'FK_dbo.AspNetUsers_dbo.DB_User_Type_DB_User_Type_Id',因此为 。