无法更新数据库,因为实体无法删除约束

时间:2014-05-06 20:56:20

标签: c# entity-framework

我创建了一些新表,我注意到我没有使用id的良好命名约定。

所以我使用新的ID进行了新的add-migration但是当我尝试update-database时出现以下错误:

  

约束' PK_dbo.DB_User_Type'正在被表引用   ' AspNetUsers',外键约束   ' FK_dbo.AspNetUsers_dbo.DB_User_Type_DB_User_Type_Id&#39 ;.无法放弃   约束。查看以前的错误。

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

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

我使用实体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");
        }

4 个答案:

答案 0 :(得分:2)

在运行update-database命令之前,我必须手动删除外键。因为我的数据库中的约束名称类似于:FK_dbo.AspNetUsers_dbo.DB_User_Type_DB_User_TypeId

虽然脚本试图删除的约束是: FK_dbo.AspNetUsers_dbo.DB_User_Type_DB_User_Type_Id

答案 1 :(得分:1)

嗯,有一些关于外键的规则 - 当你试图删除一条有另一个与之关联的记录的记录时,它们中的一些是用来处理情况的。 在您的情况下,您似乎希望将CASCADE规则应用于您的关系。这种方式实体将删除其所有FK

答案 2 :(得分:1)

我遇到了同样的问题。 This post helped me.

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

答案 3 :(得分:-1)

  1. DropForeignKey("dependantTable", "dependantColumn", "principalTable")
  2. DropPrimaryKey("principalTable")
  3. AddPrimaryKey("principalTable", "principalColumn",)
  4. AddForeignKey("dependantTable", "dependantColumn", "principalTable")