Я меняю столбец со строки на 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");
}