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

4
在我的项目中,我在Migrations文件夹中有两个EF Core迁移文件。一个是初始版本("Initial"),其中包含许多CreateTable语句;另一个是更新后的版本("Cleanup"),只包含一些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如何确定基本版本,即必须执行哪些迁移?


2
不太熟悉EF,但大多数数据库迁移都有一个历史表或类似的东西来跟踪已应用的迁移。检查并添加该迁移记录,它应该会认为已经应用了它。 - JAZ
2
@JAZ 是正确的,你要找的表是 __EFMigrationsHistory,而 MigrationId 应该与你的迁移名称匹配(例如 "20190410160507_LongRunningOperations")。 - SpruceMoose
感谢,就这些。 - Philipp
1个回答

4
我的数据库是通过调用context.Database.EnsureCreated()来创建的。
这就是问题根源。关于创建和删除API的文档包含以下内容: 警告 EnsureCreated和Migrations不能很好地配合使用。如果您正在使用Migrations,请不要使用EnsureCreated来初始化架构。
然后:
从EnsureCreated转换到Migrations并不是一个无缝的体验。最简单的方法是使用Migrations删除数据库并重新创建它。如果您预计将来使用迁移,最好直接使用Migrations而不是使用EnsureCreated。
运行时应用迁移中也类似: 警告 在执行Migrate()之前不要调用EnsureCreated()。EnsureCreated()绕过了Migrations以创建架构,这会导致Migrate()失败。
简而言之,你应该使用EF Core工具或者context.Database.Migrate()来创建/更新数据库。
既然你走错了路,那么要么按照他们的建议“删除数据库并使用Migrations重新创建”,要么尝试重构Migrations History Table,以模拟EF Core最初创建和填充它的方式,如果您使用了预期的迁移工作流程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接