Как применить миграцию Entity Framework Core для удаления поля из таблицы?

Ответ

Процесс удаления поля (столбца) из таблицы с помощью миграций EF Core состоит из трех шагов: изменение модели, создание миграции и обновление базы данных.

1. Удалите свойство из класса модели (Entity)

// Было:
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string OldField { get; set; } // Удаляем это свойство
}

// Стало:
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    // Свойство OldField удалено
}

2. Создайте и изучите миграцию

Выполните команду в консоли диспетчера пакетов (Package Manager Console) или терминале:

dotnet ef migrations add RemoveOldFieldFromProduct

EF Core сравнит модель с текущим состоянием БД и сгенерирует файл миграции. В методе Up будет операция DropColumn:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropColumn(
        name: "OldField",
        table: "Products");
}

protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AddColumn<string>(
        name: "OldField",
        table: "Products",
        type: "nvarchar(max)",
        nullable: true);
}

3. Примените миграцию к базе данных

dotnet ef database update

Критически важные замечания для продакшена:

  1. Резервное копирование: Перед удалением столбца убедитесь, что в нем нет нужных данных. Если данные могут понадобиться, сначала выполните их выгрузку или перенос в другую таблицу.
  2. Даунтайм: Операция ALTER TABLE DROP COLUMN может заблокировать таблицу. Для больших таблиц планируйте работу в период низкой нагрузки.
  3. Зависимости: Убедитесь, что удаляемое поле не используется в:
    • Хранимых процедурах, представлениях или индексах БД.
    • Коде приложения (кроме класса модели).
    • Контрактах API (DTO), которые могут сериализовать это поле.

Ответ 18+ 🔞

А, ну это ж классика, блядь! Удалить поле из таблицы через EF Core — звучит как простая задача, а потом бац, и продакшен лег, потому что забыли про индексы или триггеры какие-нибудь. Давайте по порядку, без паники.

Смотри, как это делается, если ты не полный распиздяй.

Шаг 1: Выковыриваем свойство из класса

Тут всё просто, как три копейки. Берешь свою сущность и просто вырезаешь ненужное поле. Главное — не вырезать случайно что-то нужное, а то будет тебе хиросима.

// Было — тут у нас какое-то левое поле OldField, которое всем уже опостылело
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string OldField { get; set; } // Вот эту хуйню мы и будем удалять
}

// Стало — чисто, аккуратно, без лишнего хлама
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    // А OldField тут больше нет. Всё.
}

Шаг 2: Генерируем миграцию

Теперь надо сказать EF Core: «Слушай, дружище, модель поменялась, давай-ка ты приготовишь скрипт, чтобы базу подогнать». Запускаешь команду, и пусть магия работает.

В консоли диспетчера пакетов (или обычном терминале, если ты не изнеженный):

dotnet ef migrations add RemoveOldFieldFromProduct

EF Core посмотрит, почешет репу и создаст файлик миграции. Загляни в него, особенно в метод Up — там должна быть одна-единственная операция DropColumn. Вот, смотри, красота:

protected override void Up(MigrationBuilder migrationBuilder)
{
    // Всё, приехали, поле OldField. Снимай штаны.
    migrationBuilder.DropColumn(
        name: "OldField",
        table: "Products");
}

protected override void Down(MigrationBuilder migrationBuilder)
{
    // А это на случай, если всё-таки накосячил и надо откатиться.
    migrationBuilder.AddColumn<string>(
        name: "OldField",
        table: "Products",
        type: "nvarchar(max)",
        nullable: true);
}

Шаг 3: Накатываем миграцию на базу

Самое вкусное. Команда одна, но отвественность — овердохуища.

dotnet ef database update

База обновится, поле исчезнет. В теории. На практике же...

⚠️ А теперь, сука, самое важное! Предпродакшенный спич

Ты думаешь, просто удалил поле в коде и всё? Ёпта, нет! Если так делать в продакшене, можно получить пиздец размером с дом.

  1. Бэкап, блядь! Перед тем как дропать столбец, спроси себя: «А нет ли там данных, которые ещё пригодятся?» Если есть хоть тень сомнения — выгрузи их, сохрани в отдельную таблицу, в файл, на флешку тёще. Потом, когда бухгалтерия придёт с вилами, сможешь что-то показать.

  2. Даунтайм, детка. Операция ALTER TABLE ... DROP COLUMN — это не шутка. На большой, жирной, нагруженной таблице она может взять её в блокировку на долгие секунды, а то и минуты. Все запросы встанут в очередь. Планируй это дело на время, когда народ спит, или используй хитрые схемы, если твоя БД такое умеет.

  3. Зависимости — вот где собака зарыта. Это главный подводный камень, про который все забывают.

    • В базе: Это поле не участвует в индексах, триггерах, вьюхах или хранимых процедурах? Если участвует — сначала нужно починить их, а потом уже поле удалять. Иначе миграция ебнется об ошибку.
    • В коде приложения: Ты точно вычистил все упоминания этого поля? Не только в сущности, но и в каких-нибудь репозиториях, сервисах, ручных SQL-запросах? Поиском по солюшену пройдись.
    • В API: А твои DTO (те классы, которые летят наружу) тоже почищены? А то фронтендеры получат внезапно OldField: null и обосцуются.

Короче, алгоритм простой: удали в коде → проверь всё на тестовой базе от корки до корки → накати на прод в тихий час. И тогда, возможно, тебя не уволят.

Удачи, и да пребудет с тобой сила бекапов!