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

C# 实体框架核心添加迁移从头开始创建一切,c#,.net,entity-framework,C#,.net,Entity Framework,问题如下: 我使用dotnet ef migrations add InitialStructure创建初始数据库结构 我使用dotnet ef database update创建数据库。数据库已正确创建 我在我的一个实体中添加了一列 我运行dotnet ef迁移添加NewColumnMigration。迁移已经生成,但是当我检查NewColumnMigration.cs文件时,我可以看到Up()方法尝试从头创建所有表,而不是用新列更改一个表 因此,运行dotnet ef database up

问题如下:

  • 我使用
    dotnet ef migrations add InitialStructure
    创建初始数据库结构
  • 我使用
    dotnet ef database update
    创建数据库。数据库已正确创建
  • 我在我的一个实体中添加了一列
  • 我运行
    dotnet ef迁移添加NewColumnMigration
    。迁移已经生成,但是当我检查NewColumnMigration.cs文件时,我可以看到
    Up()
    方法尝试从头创建所有表,而不是用新列更改一个表
  • 因此,运行
    dotnet ef database update
    失败,因为大多数表都已创建
  • 我做错了什么?我正在使用最新的ef core和.net core 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);
        }
    
    public MyContext CreateDbContext(字符串[]args)
    {
    var optionsBuilder=new DbContextOptionsBuilder();
    optionsBuilder.UseNpgsql(“服务器=localhost;数据库=dbname;用户Id=dbuser;密码=123;”)。EnableSensitiveDataLogging();
    返回新的MyContext(optionsBuilder.Options);
    }
    
    可能我复制了您的问题,原因是:

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

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

    我试过MSSQL和MYSQL,没有相同的问题。但这可能是一个bug,你可以把它贴在他们的项目上

    但要确保每个组件都使用最新版本,包括.NETCore和所有软件包

    这是我的示例输出

    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");
        }
    }
    
    public分部类AddFirstNameLastName:Migration
    {
    受保护的覆盖作废(MigrationBuilder MigrationBuilder)
    {
    migrationBuilder.AddColumn(
    姓名:“名字”,
    表:“AspNetUsers”,
    可为空:真);
    migrationBuilder.AddColumn(
    姓名:“姓氏”,
    表:“AspNetUsers”,
    可为空:真);
    }
    受保护的覆盖无效关闭(MigrationBuilder MigrationBuilder)
    {
    migrationBuilder.DropColumn(
    姓名:“名字”,
    表:“AspNetUsers”);
    migrationBuilder.DropColumn(
    姓名:“姓氏”,
    表:“AspNetUsers”);
    }
    }
    
    添加第二次迁移时,您的连接字符串是否指向初始结构存在的数据库?我想这没问题,因为它正确地创建了数据库创建了初始迁移并运行了数据库更新。我已经用IDesignTimeDbContextFactory中的代码片段更新了我的问题,我已经用红色标出了ef core 2.1中正确迁移处理所需的代码片段。但它仍然不起作用。我问是因为我有类似的问题。我在Docker容器中运行数据库,每次我重新启动容器时,它都会启动一个空数据库。EF需要访问具有当前结构的数据库,以查看添加迁移时需要进行哪些更改。