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
失败,因为大多数表都已创建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需要访问具有当前结构的数据库,以查看添加迁移时需要进行哪些更改。