2017-06-21 24 views
0

我創建了一個使用現有數據庫的代碼優先方法的MVC應用程序。無法從模型代碼優先刪除FK

我已經注意到,我的一個表並不需要一個外鍵,所以我試圖刪除它,但我不斷收到:

對象「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

從異常消息中可以明顯看出,您有一個名爲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 & 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

+0

好吧,我有機會獲得SSMS實例,其中我用,但我想知道關於方法的解決方案做..我必須在特定區域(如migration.cs中)創建它,或者我可以將它放在任何地方,只需在migration.cs中引用它即可? –