使用 Entity Framework Core 2.0 在不丢失数据的情况下更改或重命名列名

Change or rename a column name without losing data with Entity Framework Core 2.0

我意识到我的一个专栏 headers 拼写错误,所以我在模型中更改了它并创建了一个新的迁移以将其更新到数据库中。一切都很完美,直到我意识到实际发生的事情是一个新列取代了现有列并删除了所有数据。碰巧的是,由于这是一个教程数据库,所以恢复数据没什么大不了的,只需几分钟的工作。

How/what 我是否可以在不丢失其中数据的情况下对 update/rename 列进行操作?

不确定为什么我的搜索没有出现这个,但这里有一个直接相关的 post:

EF Core 通过将您的模型与当前数据库快照(c# class)进行比较来创建其迁移。然后它使用它来创建一个您可以查看的迁移文件。如果 EF Core 无法始终知道您是替换了此列还是创建了新列。当你检查你的迁移文件时,确保没有列丢失,索引丢失(与此列相关)等。你可以用这样的东西替换所有这些:

migrationBuilder.RenameColumn(
    name: "ColumnA",
    table: "MyTable",
    newName: "ColumnB");

migrationBuilder.RenameColumn 通常工作正常,但有时您也必须处理索引。

migrationBuilder.RenameColumn(name: "Identifier", table: "Questions", newName: "ChangedIdentifier", schema: "dbo");

更新数据库时的示例错误消息:

Microsoft.Data.SqlClient.SqlException (0x80131904): The index 'IX_Questions_Identifier' is dependent on column 'Identifier'.

The index 'IX_Questions_Identifier' is dependent on column 'Identifier'.

RENAME COLUMN Identifier failed because one or more objects access this column.

在这种情况下,您必须像这样重命名:

migrationBuilder.DropIndex(
    name: "IX_Questions_Identifier",
    table: "Questions");

migrationBuilder.RenameColumn(name: "Identifier", table: "Questions", newName: "ChangedIdentifier", schema: "dbo");

migrationBuilder.CreateIndex(
    name: "IX_Questions_ChangedIdentifier",
    table: "Questions",
    column: "ChangedIdentifier",
    unique: true,
    filter: "[ChangedIdentifier] IS NOT NULL");