EF изменяет тип данных со строки на int, как удалить и добавить столбец во время миграции - PullRequest
0 голосов
/ 16 марта 2020

Я меняю столбец со строки на int в одной таблице. Миграция была построена нормально с ef migrations add, но при попытке запустить update я получил ошибку, что

Преобразование не удалось при преобразовании значения nvarchar 'MyField' в тип данных int.

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

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterColumn<int>(
            name: "MyField",
            table: "MyTable",
            nullable: false,
            oldClrType: typeof(string));
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterColumn<string>(
            name: "MyField",
            table: "MyTable",
            nullable: false,
            oldClrType: typeof(int));
    }

Я изменил, что ниже

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropColumn("MyField", "MyTable");
        migrationBuilder.AddColumn<int>(
            name: "MyField",
            table: "MyTable",
            nullable: false);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropColumn("MyField", "MyTable");
        migrationBuilder.AddColumn<string>(
            name: "MyField",
            table: "MyTable",
            nullable: false);
    }

Теперь при запуске ef database update я получаю новую ошибку, которая имеет смысл ... кроме Я нигде не могу найти ALTER TABLE!

ALTER TABLE разрешает добавление только тех столбцов, которые могут содержать пустые значения или имеют определение DEFAULT, либо добавляемый столбец является столбцом идентификатора или метки времени, или альтернативно, если ни одно из предыдущих условий не выполнено, таблица должна быть пустой, чтобы можно было добавить этот столбец. Столбец «PlanType» нельзя добавить в непустую таблицу «Подписки», поскольку он не удовлетворяет этим условиям.

Чего мне не хватает, что не позволяет мне это сделать?

** Разрешено

За ответ @ strickt01 Мне просто нужно было разрешить nullable из Down и указать значение по умолчанию в Up

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropColumn("MyField", "MyTable");
        migrationBuilder.AddColumn<int>(
            name: "MyField",
            table: "MyTable",
            defaultValue: 1,
            nullable: false);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropColumn("MyField", "MyTable");
        migrationBuilder.AddColumn<string>(
            name: "MyField",
            table: "MyTable");
    }

1 Ответ

1 голос
/ 16 марта 2020

Удаление столбца и его повторное создание не удаляет данные в таблице. Ваша таблица Subscriptions все еще будет содержать строки. Таким образом, когда вы пытаетесь добавить столбец, который вы объявляете как ненулевое значение без значения по умолчанию, вы получаете ошибку (SQL не может заполнить текущие строки ненулевыми значениями без значения по умолчанию). На оператор ALTER TABLE ссылаются, потому что это SQL для добавления столбца:

ALTER TABLE Subscription ADD PlanType int not null

См. документы

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...