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

时间:2019-04-10 14:53:39

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

在我的项目中,我在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如何确定基本版本,即必须执行哪些迁移?

1 个答案:

答案 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如果您使用的是预期的迁移工作流程,则最初会创建并填充它。