Entity framework EF将数据类型从字符串更改为int,迁移期间如何删除和添加列
我正在将一个表上的列从string更改为int。使用ef migrations add可以很好地构建迁移,但在尝试运行更新时,我遇到了一个错误: 将nvarchar值“MyField”转换为数据时,转换失败 输入int 我不需要数据,所以我想我可以修改up/down,只需删除并重新添加列,而不需要修改。这是旧的向上/向下Entity framework EF将数据类型从字符串更改为int,迁移期间如何删除和添加列,entity-framework,Entity Framework,我正在将一个表上的列从string更改为int。使用ef migrations add可以很好地构建迁移,但在尝试运行更新时,我遇到了一个错误: 将nvarchar值“MyField”转换为数据时,转换失败 输入int 我不需要数据,所以我想我可以修改up/down,只需删除并重新添加列,而不需要修改。这是旧的向上/向下 protected override void Up(MigrationBuilder migrationBuilder) { migratio
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));
}
删除列,然后重新创建列,不会清除表中的数据。您的订阅表仍将有行。因此,当您尝试添加声明为不可空且没有默认值的列时,会出现错误SQL无法使用没有默认值的非空值填充当前行。引用ALTER TABLE语句是因为这是用于添加列的SQL:
ALTER TABLE Subscription ADD PlanType int not null
看
您需要声明默认值或将其创建为不可为空,作为迁移的一部分填充它,然后将其更改为不可为空。非常感谢,从下删除了可为空:false,并将defaultValue:1添加到上,一切都很好
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");
}
ALTER TABLE Subscription ADD PlanType int not null