Warm tip: This article is reproduced from serverfault.com, please click

entity framework-如何删除一列并创建一个新列而不是在 EF Core 中重命名?

(entity framework - How do I drop a column and create a new one instead of renaming in EF Core?)

发布于 2021-10-13 14:46:40

尝试在我的一个模型中删除两列并添加新列(已删除和新列之间没有关系),但生成的迁移改为重命名已删除列之一。由于删除的列包含生产中的数据,因此必须删除它们而不是重命名。

有没有办法解决这个问题,以便生成的迁移删除并创建而不是重命名?

模型中的变量:

public DateTime? PublishedAt { get; private set; }
public bool? IsValidated { get; private set; }
public States? States { get; private set; } // Added
public Invites? Invites { get; private set; } // Removed
public string Info { get; private set; } // Removed

生成的迁移:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropColumn(
        name: "Info",
        table: "Articles");

    migrationBuilder.RenameColumn(
        name: "Invites",
        table: "Articles",
        newName: "States");
}
Questioner
mattesj
Viewed
0
Ermiya Eskandary 2021-10-13 22:56:29

有时 EF 会认为你想要重命名列,而不是在类型相同的情况下创建列。

这不是一门精确的科学,因此要么创建一个迁移以首先删除该列,然后应用,然后创建另一个以添加一个新的,以便 EF 将它们作为单独的操作进行处理,或者我只是手动更改迁移。

如果是后一种选项,请使用MigrationBuilder.AddColumn添加States列的方法,然后更改RenameColumnDropColumn并删除Invites

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropColumn(
        name: "Info",
        table: "Articles");

    migrationBuilder.DropColumn(
        name: "Invites",
        table: "Articles");

    migrationBuilder.AddColumn(
        name: "States",
        table: "Articles");
}

如果你想恢复迁移,请记住还要更改Down(MigrationBuilder migrationBuilder)方法,以便它执行更新Up(...)方法的反向操作,而不是旧方法:

protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AddColumn(
        name: "Info",
        table: "Articles");

    migrationBuilder.AddColumn(
        name: "Invites",
        table: "Articles");

    migrationBuilder.DropColumn(
        name: "States",
        table: "Articles");
}