使用Entity Framework Core 2.0更改或重命名列名,而不会丢失数据

时间:2018-05-04 15:30:01

标签: c# entity-framework .net-core ef-migrations

我意识到我拼错了我的一个列标题,因此我在模型中更改了它并创建了一个新的迁移以将其更新到数据库中。一切都运行良好,直到我意识到实际出现的情况是新列替换了现有列并删除了所有数据。事实上,由于这是一个教程数据库,因此没有什么大不了的事情,只需几分钟的工作就可以恢复数据。

如何/如何更新/重命名列而不丢失其中的数据?

不确定我的搜索中是怎么出现的,但这是一个直接相关的帖子: Rename table field without losing data, using automatic migrations

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

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

Microsoft.Data.SqlClient.SqlException(0x80131904):索引 “ IX_Questions_Identifier”取决于列“ Identifier”。

索引“ IX_Questions_Identifier”取决于列“ Identifier”。

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