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

«Как применить миграцию Entity Framework Core для удаления поля из таблицы?» — вопрос из категории Entity Framework, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Процесс удаления поля (столбца) из таблицы с помощью миграций 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), которые могут сериализовать это поле.