问题如下:
dotnet ef migrations add InitialStructure
创建我的初始数据库结构。dotnet ef database update
创建数据库。数据库已正确创建。dotnet ef migrations add NewColumnMigration
。已经生成了迁移但是当我检查NewColumnMigration.cs文件时,我可以看到Up()
方法尝试从头开始创建所有表,而不是用新列更改一个表。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);
}
可能我转载了你的问题,原因是:
一旦添加了一个列并调用了命令'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");
}
}