在 Entity Framework Core 中使用 Update-Database 添加新列

Bon*_*ney 6 c# database entity-framework entity-framework-core

可能是我错过了一些非常明显的东西。但是我一直无法找到一种方法来向 EF Core 中的现有表/模型添加新列。

这是我正在关注的文档:https : //docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell

这就是我到目前为止所做的:

  1. 使用以下命令创建迁移:“Add-Migration -Name CodingSoldierDbContextMigration -OutputDir Migrations -Context CodingSoldierDbContext”
  2. 使用以下命令更新数据库:“Update-Database -Migration CodingSoldierDbContextMigration -Context CodingSoldierDbContext”。在数据库中创建了表。
  3. 现在我需要向现有表中添加一个新列。我将该列添加到 .cs 文件中的模型中。我删除了现有的迁移:“Remove-Migration -Force -Context CodingSoldierDbContext”
  4. 现在我重新运行步骤 1 和 2 中的命令。添加迁移工作并创建迁移。但是 Update-Database 失败并显示错误:“数据库中已经有一个名为‘AspNetRoles’的对象。” 这意味着该表已经存在于数据库中,这是有道理的。

那么如何更新一个已经存在的表格呢?我能想到的两种方法是:

  1. 删除数据库。创建迁移和更新数据库。但所有数据都将消失。
  2. 在模型中添加列。使用 SQL 脚本手动更新表以添加新列。

但我觉得应该有更好的方法来做到这一点。

Bon*_*ney 6

这就是我解决问题的方法。不确定这是否是完美的方式。

关键是在创建新迁移之前不要删除初始迁移。

此处添加步骤:

  1. 创建初始迁移:“Add-Migration -Name CodingSoldierDbContextMigration -OutputDir Migrations -Context CodingSoldierDbContext”
  2. 使用命令更新数据库:“Update-Database -Migration CodingSoldierDbContextMigration -Context CodingSoldierDbContext”。表在数据库中创建。
  3. 在其中一个模型中添加了新字段。
  4. 创建更新的迁移:“Add-Migration -Name CodingSoldierDbContextMigrationUpdated -OutputDir Migrations -Context CodingSoldierDbContext”。此迁移将仅包含用于更新现有表的代码。
  5. 使用更新后的迁移更新数据库:“Update-Database -Migration CodingSoldierDbContextMigrationUpdated”。理想情况下,这应该已经解决了。但对我来说,它给出了错误,因为(从详细日志来看)它试图通过初始迁移进行更新:“CodingSoldierDbContextMigration”,我不知道为什么。
  6. 所以我使用脚本迁移生成脚本:“Script-Migration -From CodingSoldierDbContextMigration -Idempotency -Output C:\MigrationScript.sql -Context CodingSoldierDbContext”。它生成的脚本仅在更新的迁移中进行了更改。在数据库中运行该脚本创建了该列,并在“__EFMigrationsHistory”表中添加了迁移条目。