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

时间:2017-10-03 07:03:24

标签: c# database entity-framework entity-framework-core

可能我错过了一些非常明显的事情。但我还没有找到一种方法在EF Core中为现有的表/模型添加新列。

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

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

  1. 使用此命令创建迁移:"添加迁移-Name CodingSoldierDbContextMigration -OutputDir迁移-Context CodingSoldierDbContext"
  2. 使用以下命令更新数据库:" Update-Database -Migration CodingSoldierDbContextMigration -Context CodingSoldierDbContext"。表已在数据库中创建。
  3. 现在我需要向现有表添加新列。我将该列添加到.cs文件中的模型。我删除了现有的迁移:"删除 - 迁移-Force -Context CodingSoldierDbContext"
  4. 现在我重新运行步骤1和2中的命令。添加迁移工作并创建迁移。但是Update-Database因错误而失败:"已经存在一个名为' AspNetRoles'在数据库中。"这意味着该表已经存在于数据库中,这是有意义的。
  5. 那么如何更新已存在的表格表呢? 我能想到的两种方式是:

    1. 删除数据库。创建迁移和更新数据库。但所有数据都将消失。
    2. 在模型中添加列。使用SQL脚本手动更新表以添加新列。
    3. 但我觉得应该有更好的方法来做到这一点。

5 个答案:

答案 0 :(得分:2)

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

密钥不是在创建新迁移之前删除初始迁移。

在此添加步骤:

  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”。理想情况下,这应该解决它。但对我来说,它给出了错误,因为(从Verbose日志开始)它试图用初始迁移进行更新:“CodingSoldierDbContextMigration”,我不知道为什么。
  6. 所以我使用脚本迁移生成脚本:“脚本迁移 - 从CodingSoldierDbContextMigration -Idempotent -Output C:\ MigrationScript.sql -Context CodingSoldierDbContext”。它生成的脚本仅从更新的迁移中进行了更改。在DB中运行该脚本创建了该列,并在“__EFMigrationsHistory”表中添加了迁移条目。

答案 1 :(得分:1)

我在使用EF Core和存在一些模型充实的现有数据库时遇到了类似的问题,但是我正在添加一个新模型(已经有一个表)并出现错误

There is already an object named 'tableN' in the database.

我将其用于现有数据库的方式是:

  1. 下载存储库
  2. 运行最新的所有迁移(如果您的数据库具有迁移) 如果不这样做,那么只需创建一个初始的“虚拟”迁移并应用
  3. 在更改模型/代码之前创建基线迁移
  4. 通过对数据库的任何更改来更新代码
  5. 创建另一个迁移
  6. 删除初始基准迁移
  7. 更新数据库

答案 2 :(得分:0)

这是一种帮助我在不丢失数据的情况下向现有数据库添加新列的方法:

  1. 我已将此命令写入到包含我的模型的项目的Package Manager控制台中

    add-migration MyFirstMigration
    
  2. 上面的命令创建了一个包含大量代码的类:

    public partial class MyFirstMigration : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
              ...
              // The code is omitted for the brevity
              ...
         }
    }
    
  3. 我已经删除了所有生成的代码,并将以下代码段添加到上述方法Up(MigrationBuilder migrationBuilder)中:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AddColumn<string>("Password", "Users", "varchar(255)", 
            unicode:false, maxLength: 255, nullable: true);
    }
    
  4. 然后必须将以下命令写入Package Manager控制台以在数据库中添加一列:

    Update-Database
    

答案 3 :(得分:0)

我有点混合了@Boney和@StepUp的建议,并且运行顺利。这就是我所做的。假设有一个表Period,我决定添加其他列PeriodTypeId。

  1. 添加另一个迁移。例如

let a=[[1,2],[4,5],[7,8]] let isContain = (arr) => arr.some(e=> e==''+[4,5]); console.log( isContain(a) );

这创建了一个新的迁移文件,名称为:OVCDbMigrationsUpdated。

  1. 运行针对新迁移文件的更新数据库。例如

Add-Migration -Name OVCDbMigrationsUpdated -Context DbContext

我的数据库已使用新列成功更新。

答案 4 :(得分:0)

如果我们从解决方案中排除以前的迁移,然后运行 ​​update-database cmd,Update-Database 将起作用。但是,我们可以再次包含数据库定义。 直接在EF核心+ postgresql的情况下是行不通的。