nat*_*njw 4 c# entity-framework ef-migrations .net-core
我意识到自己拼写的列标题中的一个不正确,因此我在模型中进行了更改,并创建了一个新迁移以将其更新到数据库中。在我意识到实际上似乎发生的事情是新的列替换了现有的列并擦除了所有数据之前,所有方法都运行良好。碰巧的是,由于这是一个教程数据库,将数据放回原处就没什么大不了,只需花费几分钟。
如何/如何更新/重命名列而不丢失其中的数据?
不确定在我的搜索中是怎么出现的,但这是直接相关的文章: 使用自动迁移,重命名表字段而不会丢失数据
EF Core通过将您的模型与当前数据库快照(ac#类)进行比较来创建其迁移。然后,它使用它来创建一个您可以查看的迁移文件。如果EF Core不能始终知道您是替换此列还是创建新列。检查迁移文件时,请确保没有任何列删除,索引删除(与该列相关)等。您可以将所有这些替换为以下内容:
migrationBuilder.RenameColumn(
name: "ColumnA",
table: "MyTable",
newName: "ColumnB");
Run Code Online (Sandbox Code Playgroud)
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)
归档时间: |
|
查看次数: |
2227 次 |
最近记录: |