无法从模型代码中删除FK

时间:2017-06-21 19:18:57

标签: c# asp.net-mvc entity-framework ef-migrations

我使用现有数据库的代码优先方法创建了一个MVC应用程序。

我注意到我的一张桌子不需要外键,所以我试图删除它,但我一直在拿:

  

对象' FK_BorrowedProperty_codeStatus'取决于列' StatusId'。   ALTER TABLE DROP COLUMN StatusId失败,因为一个或多个对象访问此列。

我已完成的步骤

  • 进入BorrowedProperty课程并删除了public int StatusId { get; set; }& public virtual codeStatu codeStatu { get; set; }
  • 进入CodeStatu班级并删除了[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<BorrowedProperty> BorrowedProperties { get; set; }
  • 进入我的DbContext并注释掉这一行//modelBuilder.Entity<codeStatu>() // .HasMany(e => e.BorrowedProperties) // .WithRequired(e => e.codeStatu) // .HasForeignKey(e => e.StatusId) // .WillCascadeOnDelete(false);
  • 添加迁移DeleteStatusFKFromBorrowedProperty

结果是:

public partial class DeleteStatusFKFromBorrowedProperty : DbMigration
{
    public override void Up()
    {
        DropForeignKey("dbo.BorrowedProperty", "StatusId", "dbo.codeStatus");
        DropIndex("dbo.BorrowedProperty", new[] { "StatusId" });
        DropColumn("dbo.BorrowedProperty", "StatusId");
    }

    public override void Down()
    {
        AddColumn("dbo.BorrowedProperty", "StatusId", c => c.Int(nullable: false));
        CreateIndex("dbo.BorrowedProperty", "StatusId");
        AddForeignKey("dbo.BorrowedProperty", "StatusId", "dbo.codeStatus", "Id");
    }
}
  • 更新的数据库

然后我收到上面的错误。 BorrowedProperty数据库表中有记录。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

从异常消息中可以清楚地看到,您的外键约束FK_BorrowedProperty_codeStatus会阻止StatusId列被删除。您可以创建一个包含SQL命令的方法来删除FK约束,如下所示:

private void DropForeignKeyConstraint()
{
    // This command may work if the constraint name is known:
    // Sql(@"ALTER TABLE [dbo].[BorrowedProperty] DROP CONSTRAINT [FK_BorrowedProperty_codeStatus]");

    Sql(@"DECLARE @constraint NVARCHAR(128)
        SELECT @constraint = name
        FROM sys.default_constraints
        WHERE parent_object_id = object_id(N'dbo.BorrowedProperty')
        AND col_name(parent_object_id, parent_column_id) = 'StatusId';
        IF @constraint IS NOT NULL
           EXECUTE('ALTER TABLE [dbo].[BorrowedProperty] DROP CONSTRAINT [' + @constraint + ']')");
}

将方法放在Up方法内的迁移代码上,如下所示:

public partial class DeleteStatusFKFromBorrowedProperty : DbMigration
{
    public override void Up()
    {
        DropForeignKeyConstraint(); // dropping FK constraint first
        DropForeignKey("dbo.BorrowedProperty", "StatusId", "dbo.codeStatus");
        DropIndex("dbo.BorrowedProperty", new[] { "StatusId" });
        DropColumn("dbo.BorrowedProperty", "StatusId"); // drop column at last
    }
}

或者,如果您可以访问SSMS实例,请直接运行此查询:

ALTER TABLE [dbo].[BorrowedProperty] DROP CONSTRAINT [FK_BorrowedProperty_codeStatus]

注意:您可以尝试在Down方法中注释掉所有代码行,以查看外键约束是否未重新创建。

之后,您可以执行Add-Migration&amp;在程序包管理器控制台中Update-Database应用上述更改。

类似问题:

The object 'DF__*' is dependent on column '*' - Changing int to double

How do I drop a column with object dependencies in SQL Server 2008?

Entity Framework Migrations can't drop table because of foreign key constraint