首页 > 解决方案 > EF Core 数据库更新指定基本版本

问题描述

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

我的数据库是通过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 也希望应用第一次迁移。是否有指定数据库基本版本的选项?我可以做些什么来避免执行“初始”迁移吗?

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

标签: c#entity-framework-coreentity-framework-migrations

解决方案


我的数据库是通过调用创建的context.Database.EnsureCreated()

这就是问题的根源。创建和删除 API的文档包含以下内容:

警告

EnsureCreated 和 Migrations 不能很好地协同工作。如果您使用迁移,请不要使用 EnsureCreated 来初始化架构。

进而:

从 EnsureCreated 过渡到 Migrations 并不是一种无缝的体验。最简单的方法是删除数据库并使用迁移重新创建它。如果您预计将来会使用迁移,最好从迁移开始,而不是使用 EnsureCreated。

在运行时应用迁移中类似:

警告

  • EnsureCreated()之前不要打电话Migrate()EnsureCreated()绕过迁移来创建架构,这会导致Migrate()失败。

很快,您应该已经使用过 EF Core 工具或context.Database.Migrate()用于创建/更新数据库。

由于您以错误的方式执行此操作,请按照他们的建议“删除数据库并使用迁移重新创建它”,或者尝试按照 EF Core 最初创建并填充它的方式重建迁移历史记录表,如果您使用预期的迁移工作流程。


推荐阅读