【问题标题】:EF Core database update specify base versionEF Core 数据库更新指定基本版本
【发布时间】:2019-04-11 01:29:09
【问题描述】:

在我的项目中,我在基于初始版本和更新后创建的 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 也希望应用第一次迁移。是否有指定数据库基本版本的选项?我可以采取其他措施来避免执行“初始”迁移吗?

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

【问题讨论】:

  • 对 EF 不太熟悉,但大多数数据库迁移都有历史表或其他东西来跟踪应用的迁移。检查并添加该迁移记录,它应该认为它已经应用了它。
  • @JAZ 是正确的,您要查找的表是 __EFMigrationsHistory 并且 MigrationId 应该与您的迁移名称匹配(例如“20190410160507_LongRunningOperations”)
  • 谢谢,就是这样。如果您愿意,可以将此作为答案。

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


【解决方案1】:

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

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

警告

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

然后:

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

类似Apply migrations at runtime:

警告

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

简而言之,您应该使用 EF Core 工具或 context.Database.Migrate() 来创建/更新数据库。

既然你做错了,要么按照他们的建议“删除数据库并使用迁移重新创建它”,或者尝试按照 EF Core 的方式重建 Migrations History Table如果您使用的是预期的迁移工作流程,则最初创建并填充它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2021-02-26
    相关资源
    最近更新 更多