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

nat*_*njw 4 c# entity-framework ef-migrations .net-core

我意识到自己拼写的列标题中的一个不正确,因此我在模型中进行了更改,并创建了一个新迁移以将其更新到数据库中。在我意识到实际上似乎发生的事情是新的列替换了现有的列并擦除了所有数据之前,所有方法都运行良好。碰巧的是,由于这是一个教程数据库,将数据放回原处就没什么大不了,只需花费几分钟。

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

不确定在我的搜索中是怎么出现的,但这是直接相关的文章: 使用自动迁移,重命名表字段而不会丢失数据

Nev*_*ane 6

EF Core通过将您的模型与当前数据库快照(ac#类)进行比较来创建其迁移。然后,它使用它来创建一个您可以查看的迁移文件。如果EF Core不能始终知道您是替换此列还是创建新列。检查迁移文件时,请确保没有任何列删除,索引删除(与该列相关)等。您可以将所有这些替换为以下内容:

migrationBuilder.RenameColumn(
    name: "ColumnA",
    table: "MyTable",
    newName: "ColumnB");
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚重命名了 C# 实体中的属性(使用 VS 重命名功能),运行了 add-migration“rename”,它准确地生成了 RenameColumn 函数调用。所以它现在可以独立工作了! (3认同)
  • EF 如何知道列已重命名?据它所知,一个领域消失了,另一个领域出现了。除非它进行一些智能比较(在我看来这将非常复杂。例如,将“UserId”更改为“Id”对于人类来说很容易,而不是人工智能。 (2认同)
  • EF 并不完全“知道”。这就是本次讨论的目的。EF 会尝试猜测并创建一个“迁移文件”。然后,我们可以根据需要手动更新迁移文件。 (2认同)

Ogg*_*las 6

migrationBuilder.RenameColumn通常工作得很好,但有时你也必须处理索引。

migrationBuilder.RenameColumn(name: "Identifier", table: "Questions", newName: "ChangedIdentifier", schema: "dbo");
Run Code Online (Sandbox Code Playgroud)

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

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");
Run Code Online (Sandbox Code Playgroud)