Миграции Entity Framework не могут отменить таблицу из-за ограничения внешнего ключа

У меня есть обратная конструкция существующей базы данных для первой модели кода. Некоторые таблицы должны быть сохранены, но большинство из них должны быть удалены и полностью перепроектированы для новой версии.

Я удаляю несколько старых классов и их сопоставление и добавление-перенос.

Миграция выглядит следующим образом:

  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");
        }

Однако, когда я запускаю перенос, я получаю следующую ошибку в консоли диспетчера пакетов.

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

Почему я получаю эту ошибку, когда миграция должна была уже сбросить какие-либо внешние ключи до команды drop table? Есть ли способ обойти это?

Ответ 1

Если имя таблицы dbo.Bingo_Bonus когда-либо было изменено или если какой-либо из столбцов отношений внешнего ключа был изменен, EF не будет автоматически переименовывать ограничения внешнего ключа для соответствия. У меня была аналогичная проблема, и мне пришлось вручную добавить такую ​​строку, потому что функция DropForeignKey() фактически не удаляла ключ, который он должен был:

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

Ответ 2

Вы не можете отбросить таблицу Bingo_Bonus, поскольку она все еще имеет ссылки на таблицы Bingo_Bonus_Amount и Bingo_Bonus_Type, изменение порядка в методе Up() решит проблему

поставив:

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

перед:

DropTable("dbo.Bingo_Bonus");

Ваш код будет:

 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");

    }

Ответ 3

Мне удалось отказаться от использования графического интерфейса. Когда вы пытались запустить запрос с помощью alter, '.' символ отображал некоторую ошибку.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь