如何删除一列并创建一个新列而不是在 EF Core 中重命名?
How do I drop a column and create a new one instead of renaming in EF Core?
尝试在我的一个模型中删除两列并添加一个新列(删除和新建之间没有关系),但生成的迁移重命名了其中一个已删除的列。由于删除的列在生产中保存数据,因此必须删除它们而不是重命名。
有没有办法解决这个问题,使生成的迁移删除并创建而不是重命名?
模型中的变量:
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");
}
有时 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");
}
尝试在我的一个模型中删除两列并添加一个新列(删除和新建之间没有关系),但生成的迁移重命名了其中一个已删除的列。由于删除的列在生产中保存数据,因此必须删除它们而不是重命名。
有没有办法解决这个问题,使生成的迁移删除并创建而不是重命名?
模型中的变量:
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");
}
有时 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");
}