实体框架核心添加迁移从头开始创建所有内容

问题描述 投票:0回答:1

问题如下:

  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);
    }
c# .net entity-framework
1个回答
1
投票

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

一旦添加了一个列并调用了命令'Add-Migration AddColumn',类ApplicationDbContextModelSnapshot.cs将被更改,您的更改将存储在此处。

但是如果你删除迁移代码'xxxx_AddColumn.cs',然后再次运行相同的命令,它将产生奇怪的迁移代码,因为它不知道新的更新在哪里,比较你最新的ApplicationDbContextModelSnapshot.cs,所以你必须删除新的更改此文件在运行其他命令之前。

我尝试过MSSQL和MYSQL,没有同样的问题。但可能是PostgreSQL provider: Npgsql.EntityFrameworkCore.PostgreSQL的一个错误,你可以将它发布在他们的项目中。

但请确保您为每个组件使用最新版本,包括.NET核心和所有软件包。

这是我的示例输出。

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");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.