Entity framework EF将数据类型从字符串更改为int,迁移期间如何删除和添加列

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

我正在将一个表上的列从string更改为int。使用ef migrations add可以很好地构建迁移,但在尝试运行更新时,我遇到了一个错误:

将nvarchar值“MyField”转换为数据时,转换失败 输入int

我不需要数据,所以我想我可以修改up/down,只需删除并重新添加列,而不需要修改。这是旧的向上/向下

    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