实体框架核心添加迁移从头开始创建一切

时间:2018-09-06 13:00:31

标签: c# .net entity-framework

问题如下:

  1. 我使用dotnet ef migrations add InitialStructure创建我的初始数据库结构。
  2. 我使用dotnet ef database update创建数据库。数据库已正确创建。
  3. 我在一个实体中添加了一个列。
  4. 我运行dotnet ef migrations add NewColumnMigration。迁移已生成,但是当我检查NewColumnMigration.cs文件时,可以看到Up()方法尝试从头开始创建所有表,而不是用新列更改一个表。
  5. 结果,由于大多数表已经创建,因此运行dotnet ef database update失败。

我在这里做错了什么?我正在将最新的ef核心与.net核心2.1配合使用。我是否应该重写整个Up()方法并自己更改表?

EDIT1:

这是我的IDesignTimeDbContextFactory类中的内容:

public MyContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
        optionsBuilder.UseNpgsql("Server=localhost;Database=dbname;User Id=dbuser;Password=123;").EnableSensitiveDataLogging();

        return new MyContext(optionsBuilder.Options);
    }

1 个答案:

答案 0 :(得分:1)

可能是我转载了您的问题,原因是:

添加列并调用命令“ Add-Migration AddColumn”后,类ApplicationDbContextModelSnapshot.cs将被更改,所做的更改将存储在此处。

但是,如果您删除迁移代码“ xxxx_AddColumn.cs”,然后再次运行相同的命令,则会生成奇怪的迁移代码,因为与最新的ApplicationDbContextModelSnapshot.cs相比,它不知道新更新在哪里,因此您必须先删除此文件中的新更改,然后再运行其他命令。

我尝试了MSSQL和MYSQL,没有相同的问题。但可能是PostgreSQL provider: Npgsql.EntityFrameworkCore.PostgreSQL的错误,您可以将其发布到他们的项目中。

,但请确保对每个组件(包括.NET Core和所有软件包)都使用最新版本。

这是我的示例输出。

public partial class AddFirstNameLastName : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AddColumn<string>(
            name: "FirstName",
            table: "AspNetUsers",
            nullable: true);

        migrationBuilder.AddColumn<string>(
            name: "LastName",
            table: "AspNetUsers",
            nullable: true);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropColumn(
            name: "FirstName",
            table: "AspNetUsers");

        migrationBuilder.DropColumn(
            name: "LastName",
            table: "AspNetUsers");
    }
}