在我的项目中,我在Migrations文件夹中有两个EF核心迁移文件,这些文件是根据初始发行版和更新后创建的。初始迁移(“初始”)包含许多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如何确定基本版本,即必须执行哪些迁移?
答案 0 :(得分:2)
我的数据库是通过调用
创建的context.Database.EnsureCreated()
这是问题的根源。 Create and Drop APIs的文档包含以下内容:
警告
EnsureCreated和Migrations不能很好地协同工作。如果您使用的是迁移,请不要使用“确保创建”来初始化架构。
然后:
从“确保创建”到“迁移”的过渡不是无缝的体验。最简单的方法是删除数据库,然后使用Migrations重新创建它。如果您预计将来会使用迁移,则最好从迁移开始,而不要使用确保创建。
与Apply migrations at runtime类似:
警告
- 请勿在{{1}}之前致电
EnsureCreated()
。Migrate()
绕过迁移来创建架构,这导致EnsureCreated()
失败。
很快,您应该已经使用EF Core工具或Migrate()
来创建/更新数据库。
由于您使用了错误的方式,请按照他们的建议“删除数据库并使用Migrations重新创建” ,或尝试以Migrations History Table的方式重构EF Core如果您使用的是预期的迁移工作流程,则最初会创建并填充它。