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

问题描述 投票:3回答:1

在我的项目中,我在Migrations文件夹中有两个EF核心迁移文件,我根据初始版本和更新后创建了该文件。初始迁移(“Initial”)包含许多CreateTable语句,而第二次迁移(“Cleanup”)仅在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-core ef-migrations
1个回答
2
投票

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

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

警告

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

然后:

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

类似于Apply migrations at runtime

警告

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

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

由于您以错误的方式执行操作,请按照他们的建议“删除数据库并使用迁移重新创建它”,或尝试按照EF Core创建的方式重新构建Migrations History Table,如果您使用的是预期的迁移,则最初填充它流程。

© www.soinside.com 2019 - 2024. All rights reserved.