EF Core 数据库更新指定基础版本

EF Core database update specify base version

在我的项目中,我在 Migrations 文件夹中有两个 EF 核心迁移文件,它们是我根据初始版本和更新后创建的。初始迁移 ("Initial") 包含许多 CreateTable 语句,而第二次迁移 ("Cleanup") 在其 Up 方法中仅包含一些 DropColumn 语句。

我的数据库是通过在第一次和第二次迁移之间调用 context.Database.EnsureCreated() 创建的,即我现在想执行第二次迁移。 但是,如果我调用 dotnet ef database update Cleanup 我收到一个错误:

Applying migration '20190409043916_Initial'.
Failed executing DbCommand (6ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [LongRunningOperations] (
    [Id] bigint NOT NULL IDENTITY,
    [Start] datetime2 NOT NULL,
    [End] datetime2 NULL,
    [Discriminator] nvarchar(max) NOT NULL,
    CONSTRAINT [PK_LongRunningOperations] PRIMARY KEY ([Id])
);
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'LongRunningOperations' in the database.

显然,EF 也想应用第一个迁移。是否有指定数据库基本版本的选项?我可以采取其他措施来避免执行 "Initial" 迁移吗?

一个可能有助于我理解正在发生的事情的更普遍的问题:EF Core 如何确定基本版本是什么,即必须执行哪些迁移?

My database was created by a call to context.Database.EnsureCreated()

这就是问题的根源。 Create and Drop APIs 的文档包含以下内容:

Warning

EnsureCreated and Migrations don't work well together. If you're using Migrations, don't use EnsureCreated to initialize the schema.

然后:

Transitioning from EnsureCreated to Migrations is not a seamless experience. The simplest way to do it is to drop the database and re-create it using Migrations. If you anticipate using migrations in the future, it's best to just start with Migrations instead of using EnsureCreated.

类似Apply migrations at runtime

Warning

  • Don't call EnsureCreated() before Migrate(). EnsureCreated() bypasses Migrations to create the schema, which causes Migrate() to fail.

不久,您应该使用 EF Core 工具或 context.Database.Migrate() 用于 creating/updating 数据库。

因为你做错了,要么按照他们的建议 "drop the database and re-create it using Migrations",要么尝试按照 EF Core 的方式重建 Migrations History Table如果您使用的是预期的迁移工作流程,则最初会创建并填充它。