EF Code-First迁移ALTER TABLE DROP COLUMN Id失败,因为一个或多个对象访问此列

问题描述 投票:2回答:2

我在更新数据库时遇到问题,当我应用迁移时,我收到此错误:

The object 'PK_dbo.CostCenter' is dependent on column 'Id'.
ALTER TABLE DROP COLUMN Id failed because one or more objects access this column.

我只是尝试向此表添加虚拟属性(Cost Center)以便能够获取该数据

[Table("Department")]
public class Department
{
    public int Id { get; set; }

    public string Code { get; set; }

    public virtual IList<Cost> Costs_Department { get; set; }
    public virtual CostCenter CostCenter { get; set; }
}

这是成本中心表

[Table("CostCenter")]
public class CostCenter
{
    public int Id { get; set; }

    public string Code { get; set; }

    [Required]
    public virtual Department Department { get; set; }
}

和另一个与部门有关的表格

[Table("Cost")]
public class Cost
{
    public int Id { get; set; }

    ...

    public virtual Department Departament { get; set; }
    public virtual Material Material { get; set; }
}

我添加的唯一更改是Department表上的CostCenter属性,这是VS在迁移文件上创建的

public partial class CC : DbMigration
{
    public override void Up()
    {
        DropForeignKey("dbo.CostCenter", "Department_CostCenter_Id", "dbo.Department");
        DropIndex("dbo.CostCenter", new[] { "Department_CostCenter_Id" });
        DropColumn("dbo.CostCenter", "Id");
        RenameColumn(table: "dbo.CostCenter", name: "Department_CostCenter_Id", newName: "Id");
        DropPrimaryKey("dbo.CostCenter");
        AlterColumn("dbo.CostCenter", "Id", c => c.Int(nullable: false));
        AddPrimaryKey("dbo.CostCenter", "Id");
        CreateIndex("dbo.CostCenter", "Id");
        AddForeignKey("dbo.CostCenter", "Id", "dbo.Department", "Id");
    }

    public override void Down()
    {
        DropForeignKey("dbo.CostCenter", "Id", "dbo.Department");
        DropIndex("dbo.CostCenter", new[] { "Id" });
        DropPrimaryKey("dbo.CostCenter");
        AlterColumn("dbo.CostCenter", "Id", c => c.Int(nullable: false, identity: true));
        AddPrimaryKey("dbo.CostCenter", "Id");
        RenameColumn(table: "dbo.CostCenter", name: "Id", newName: "Department_CostCenter_Id");
        AddColumn("dbo.CostCenter", "Id", c => c.Int(nullable: false, identity: true));
        CreateIndex("dbo.CostCenter", "Department_CostCenter_Id");
        AddForeignKey("dbo.CostCenter", "Department_CostCenter_Id", "dbo.Department", "Id", cascadeDelete: true);
    }
}

我已经在其他表上有类似的关系了,所以这次我不知道是什么导致了这个问题

sql-server entity-framework ef-migrations
2个回答
2
投票

我遇到了类似的问题,只是删除所有以前的迁移文件,创建一个新文件并执行update-database命令。如果可以,也删除数据库,在它之前。


1
投票

根据上面建议的解决方案,一旦你在生产中,丢弃数据库将不是这种情况。

就我而言,

  • 首先,我通过编辑我的实体来删除两个表之间的关系
  • 然后创建一个将具有这些更改的迁移脚本(删除关系更改)
  • 运行update-database命令。
  • 然后编辑您的实体以删除该列。
  • 然后创建一个将包含最新更改的迁移脚本 (下降栏)
  • 之后,编辑您的实体以再次建立关系
  • 然后,您可以添加另一个迁移,该迁移将进行更改以重新创建表之间的关系。
  • 最后一步,运行update-database命令发布更改。

这是最好的解决方案吗?

  • 我对此表示怀疑。

问题是解决了吗?

  • 是。
© www.soinside.com 2019 - 2024. All rights reserved.