我意识到我的一个列标题拼写错误,因此我在模型中更改了它并创建了一个新的迁移以将其更新到数据库中。一切都很完美,直到我意识到实际发生的情况是一个新列取代了现有列并删除了所有数据。碰巧,因为这是一个教程数据库,所以没什么大不了的,只需几分钟即可将数据恢复。
如何/做什么来更新/重命名列而不丢失其中的数据?
不知道我的搜索中怎么没有出现这个问题,但这是一篇直接相关的帖子: 使用自动迁移重命名表字段而不丢失数据
EF Core 通过将模型与当前数据库快照(C# 类)进行比较来创建迁移。然后,它使用它来创建您可以查看的迁移文件。但是,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");
我已重命名我的模型类之一的列名称。
public class Technology
{
public Guid Id { get; set; }
public string Tech(Changed this name to TechName){ get; set; }
public bool? Active { get; set; }
public int Total_number_of_sets { get; set; }
public DateTime CreatedDateTime { get; set; }
public DateTime? UpdatedDateTime { get; set; }
}
对于 Entity Framework Core,请执行以下步骤。
(1)添加迁移“重命名”
运行此命令后,将创建
public partial class rename : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "Tech",
table: "Technologies",
newName: "TechName");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "TechName",
table: "Technologies",
newName: "Tech");
}
}
(2)更新数据库。