如何使用 EF 迁移向现有表添加新列并根据现有列设置其值

Hop*_*ess 9 .net entity-framework-core

例如,有一个包含值的表:

Id CarModel
1  Passat
2  Land Cruiser
Run Code Online (Sandbox Code Playgroud)

并且需要添加不可为空的列Manufacturer。制造商的初始值(对于现有记录)应为:

For CarModel=Passat - VW 
For CarModel=Land Cruiser - Toyota
etc.
Run Code Online (Sandbox Code Playgroud)

我的迁移:

protected override void Up(MigrationBuilder migrationBuilder)
{
  migrationBuilder.AddColumn<string>(
  name: "Manufacturer",
  table: "Cars",
  nullable: false);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Iva*_*oev 15

没有真正好的方法可以做到这一点。您需要手动编辑生成的迁移,如下所示:

  1. 修改命令以创建最初设置为 (即可选AddColumn)的列。nullabletrue
  2. Sql使用方法和原始 SQL 命令填充列。
  3. 添加AlterColumn命令以将列更改nullable为预期的false(即必需的)。

像这样的东西:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AddColumn<string>(
        name: "Manufacturer",
        table: "Cars",
        nullable: true);

    migrationBuilder.Sql(
@"UPDATE Cars SET Manufacturer = CASE CarModel
  WHEN 'Passat' THEN 'VW'
  WHEN 'Land Cruiser' THEN 'Toyota'
  ELSE 'Other' END");

    migrationBuilder.AlterColumn<string>(
        name: "Manufacturer",
        table: "Cars",
        nullable: false,
        oldClrType: typeof(string),
        oldNullable: true);
}
Run Code Online (Sandbox Code Playgroud)