Как мне удалить столбец и создать новый вместо переименования в EF Core?

#entity-framework #.net-core

#entity-framework #.net-core

Вопрос:

Пытаюсь удалить два столбца и добавить новый столбец (нет связи между удаленным и новым) в одной из моих моделей, но сгенерированная миграция переименовывает один из удаленных столбцов. Поскольку удаленные столбцы содержат данные в рабочей среде, они должны быть удалены, а не переименованы.

Есть ли способ исправить это, чтобы сгенерированная миграция удалялась и создавалась вместо переименования?

Переменные в модели:

 public DateTime? PublishedAt { get; private set; }
public bool? IsValidated { get; private set; }
public States? States { get; private set; } // Added
public Invites? Invites { get; private set; } // Removed
public string Info { get; private set; } // Removed
 

Сгенерированная миграция:

 protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropColumn(
        name: "Info",
        table: "Articles");

    migrationBuilder.RenameColumn(
        name: "Invites",
        table: "Articles",
        newName: "States");
}
 

Комментарии:

1. Один из способов решить эту проблему — внести изменения в модель в два этапа, чтобы вы стали двумя миграциями. Одна миграция для удаления столбцов и другая миграция для добавления нового поля. Вы также можете управлять миграцией вручную, чтобы удалить два столбца и добавить новый. Если вы выберете последний подход, лучше всего также внести обратное изменение в метод Down() .

Ответ №1:

Иногда EF может подумать, что вы хотите переименовать столбец, в отличие от создания столбца, если типы совпадают.

Это не точная наука, поэтому либо создайте миграцию, чтобы сначала удалить столбец, применить, затем создать другой, чтобы добавить новый, чтобы EF воспринимал их как отдельные операции, либо я бы просто изменил миграцию вручную.

В случае последнего варианта используйте MigrationBuilder.AddColumn метод, чтобы добавить States столбец, а затем изменить RenameColumn и DropColumn удалить Invites :

 protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropColumn(
        name: "Info",
        table: "Articles");

    migrationBuilder.DropColumn(
        name: "Invites",
        table: "Articles");

    migrationBuilder.AddColumn(
        name: "States",
        table: "Articles");
}
 

Если вы когда-нибудь захотите отменить миграцию, не забудьте также изменить Down(MigrationBuilder migrationBuilder) метод, чтобы он выполнял обратный вашему обновленному Up(...) методу, а не старому:

 protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AddColumn(
        name: "Info",
        table: "Articles");

    migrationBuilder.AddColumn(
        name: "Invites",
        table: "Articles");

    migrationBuilder.DropColumn(
        name: "States",
        table: "Articles");
}