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

Posted

技术标签:

【中文标题】如何删除一列并创建一个新列而不是在 EF Core 中重命名?【英文标题】:How do I drop a column and create a new one instead of renaming in EF Core? 【发布时间】:2021-12-02 01:25:36 【问题描述】:

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

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

模型中的变量:

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");

【问题讨论】:

解决这个问题的一种方法是分两个阶段进行模型更改,以便您成为两个迁移。一个迁移用于删除列,另一个迁移用于添加新字段。您还可以手动操作迁移,以便它删除两个列并添加一个新列。如果您选择后一种方法,最好在 Down() 方法中也进行反向更改。 【参考方案1】:

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

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

如果是后一种选项,请使用MigrationBuilder.AddColumn 方法添加States 列,然后将RenameColumn 更改为DropColumn 并删除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");

【讨论】:

以上是关于如何删除一列并创建一个新列而不是在 EF Core 中重命名?的主要内容,如果未能解决你的问题,请参考以下文章

在pandas数据框中搜索文本列而不进行循环

如何向现有的 Azure 表存储添加新列

使用 dplyr 复制一列并为 R 中的新列添加前缀

java中的保存函数创建新列而不是覆盖

根据前一行值创建一个新列并删除当前行

如何使用Scala的DataFrame比较表中的每一列而不关心列是啥? [重复]