wake-up-neo.com

Entity Framework-Migrationen können die Tabelle aufgrund einer Fremdschlüsseleinschränkung nicht löschen

Ich habe die vorhandene Datenbank auf das Code-First-Modell zurückentwickelt. Einige Tabellen müssen aufbewahrt werden, die meisten jedoch müssen entfernt und für die neue Version vollständig neu erstellt werden.

Ich lösche einige alte Klassen und deren Zuordnung und Add-Migration.

Die Migration sieht folgendermaßen aus:

  public override void Up()
        {
            DropForeignKey("dbo.Bingo_Review", "BingoID", "dbo.Bingo");
            DropForeignKey("dbo.Bingo_Review_Text", "BingoReviewID", "dbo.Bingo_Review");
            DropForeignKey("dbo.Bingo_Bonus", "BingoID", "dbo.Bingo");
            DropForeignKey("dbo.Bingo_Bonus_Amount", "BingoBonusID", "dbo.Bingo_Bonus");
            DropIndex("dbo.Bingo_Bonus", new[] { "BingoID" });
            DropIndex("dbo.Bingo_Review", new[] { "BingoID" });
            DropIndex("dbo.Bingo_Review_Text", new[] { "BingoReviewID" });
            DropIndex("dbo.Bingo_Bonus_Amount", new[] { "BingoBonusID" });
            DropTable("dbo.Bingo_Bonus");
            DropTable("dbo.Bingo");
            DropTable("dbo.Bingo_Review");
            DropTable("dbo.Bingo_Review_Text");
            DropTable("dbo.Bingo_Bonus_Amount");
            DropTable("dbo.Bingo_Bonus_Type");
        }

Beim Ausführen der Migration erhalte ich jedoch die folgende Fehlermeldung in der Paket-Manager-Konsole.

Could not drop object 'dbo.Bingo_Bonus' because it is referenced by a FOREIGN KEY constraint.

Warum erhalte ich diese Fehlermeldung, wenn bei der Migration bereits Fremdschlüssel vor dem Befehl drop table gelöscht werden sollten? Gibt es einen Weg, um das zu umgehen?

15
Dan Cook

Wenn sich der dbo.Bingo_Bonus-Tabellenname jemals geändert hat oder wenn sich eine der Spalten in den Fremdschlüsselbeziehungen geändert hat, benennt EF die Fremdschlüsseleinschränkungen nicht automatisch entsprechend um. Ich hatte ein ähnliches Problem und musste eine Zeile wie diese manuell hinzufügen, da die Funktion DropForeignKey() den Schlüssel nicht wirklich löschte:

Sql(@"ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [FK_dbo.Constraint_Name_From_Before_Table_Change]");
30
Andy Raddatz

Sie können die Bingo_Bonus-Tabelle nicht löschen, da sie immer noch Verweise auf Bingo_Bonus_Amount- und Bingo_Bonus_Type-Tabellen enthält. Durch das Ändern der Reihenfolge in der Up () - Methode wird das Problem gelöst

durch setzen:

DropTable("dbo.Bingo_Bonus_Amount");
DropTable("dbo.Bingo_Bonus_Type");

vor:

DropTable("dbo.Bingo_Bonus");

Ihr Code lautet:

 public override void Up()
    {
        DropForeignKey("dbo.Bingo_Review", "BingoID", "dbo.Bingo");
        DropForeignKey("dbo.Bingo_Review_Text", "BingoReviewID", "dbo.Bingo_Review");
        DropForeignKey("dbo.Bingo_Bonus", "BingoID", "dbo.Bingo");
        DropForeignKey("dbo.Bingo_Bonus_Amount", "BingoBonusID", "dbo.Bingo_Bonus");
        DropIndex("dbo.Bingo_Bonus", new[] { "BingoID" });
        DropIndex("dbo.Bingo_Review", new[] { "BingoID" });
        DropIndex("dbo.Bingo_Review_Text", new[] { "BingoReviewID" });
        DropIndex("dbo.Bingo_Bonus_Amount", new[] { "BingoBonusID" });
        DropTable("dbo.Bingo_Bonus_Amount");
        DropTable("dbo.Bingo_Bonus_Type");
        DropTable("dbo.Bingo_Bonus");
        DropTable("dbo.Bingo");
        DropTable("dbo.Bingo_Review");
        DropTable("dbo.Bingo_Review_Text");

    }
4

Ich konnte mit GUI abbrechen. Beim Versuch, die Abfrage mit alter auszuführen, wird das '.' Es wurde ein Fehler angezeigt

 enter image description here

 enter image description here

 enter image description here

1
Arun Prasad E S