繁体   English   中英

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

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

我意识到我的一个列标题拼写错误,所以我在模型中更改了它并创建了一个新的迁移以将其更新到数据库中。 一切都很完美,直到我意识到实际上似乎发生的是一个新列替换了现有列并删除了所有数据。 碰巧的是,因为这是一个教程数据库,所以把数据放回去没什么大不了的,几分钟的工作。

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

不知道这在我的搜索中如何没有出现,但这里有一个直接相关的帖子: 重命名表字段而不会丢失数据,使用自动迁移

EF Core 通过将您的模型与当前数据库快照(ac# 类)进行比较来创建其迁移。 然后它使用它来创建一个您可以查看的迁移文件。 如果 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):索引“IX_Questions_Identifier”依赖于“Identifier”列。

索引 'IX_Questions_Identifier' 依赖于列 'Identifier'。

RENAME COLUMN Identifier 失败,因为一个或多个对象访问此列。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM