Entity Framework 6.2 迁移工具仅支持在连接到实际数据库时编写向下迁移脚本

Chr*_*sgh 8 c# entity-framework entity-framework-6 entity-framework-migrations

尝试从 Entity Framework 6.2 代码编写迁移脚本,但当显式指定源迁移和目标迁移时,向下迁移脚本生成失败。

例如,我有一个DbContext包含三个迁移的测试项目:

  1. 201506161504528_InitialCreate
  2. 202202102238227_Add_Entity_FantasticalCreature
  3. 202202102239481_FantasticalCreature_Add_IsWinged_Add_HasTail

使用以下命令明确编写向上迁移脚本可以正常工作:

Update-Database -SourceMigration "201506161504528_InitialCreate" `
      -TargetMigration "202202102238227_Add_Entity_FantasticalCreature" `
      -Script -Verbose


.\migrate.exe "TestContext.dll" 
       /targetMigration="202202102238227_Add_Entity_FantasticalCreature" 
       /scriptFile="script.sql" 
       /sourceMigration="201506161504528_InitialCreate" /verbose
Run Code Online (Sandbox Code Playgroud)

此外,在显式指定源迁移和目标迁移时,使用具有类似参数的MigratorScriptingDecoratorScriptUpdate也会生成向上脚本。

然而,当尝试执行相反的操作时,即编写向下迁移脚本,其中目标和源均已明确指定,并且源是“较低”MigrationId,则上述所有方法都将失败。

例如,Update-Database这样调用:

update-database -SourceMigration "202202102238227_Add_Entity_FantasticalCreature" `
                -TargetMigration "201506161504528_InitialCreate" `
                -Script -Verbose
Run Code Online (Sandbox Code Playgroud)

结果出现异常:

System.Data.Entity.Migrations.Infrastruct.MigrationsException:不支持在两个指定迁移之间编写降级脚本。

在 System.Data.Entity.Migrations.Infrastruct.MigratorScriptingDecorator.ScriptUpdate(String sourceMigration, String targetMigration)
在 System.Data.Entity.Migrations.Design.ToolingFacade.ScriptUpdateRunner.RunCore()
在 System.Data.Entity.Migrations.Design。 ToolingFacade.BaseRunner.Run()

不支持在两个指定迁移之间编写降级脚本。

尝试使用 或 进行显式向下脚本迁移时也会发生相同的migrate.exe异常MigratorScriptingDecorator.ScriptUpdate

但是,如果未显式指定源迁移,但指定了目标迁移,并且向比指定目标迁移“更高”迁移的数据库提供连接字符串,则上述所有三种方法都将成功生成向下迁移SQL脚本。

例如,使用以下命令成功生成向下迁移Update-Database

# Assumes TestContextDb-01 is currently at migration 2 or 3.
Update-Database -TargetMigration "201506161504528_InitialCreate" `
                -Script `
                -ConnectionString "Data Source=localhost; Initial Catalog=TestContextDb-01; Integrated Security=true;" `
                -ConnectionProviderName "System.Data.SqlClient" -Verbose
Run Code Online (Sandbox Code Playgroud)

为什么会这样:

  • 向上迁移脚本生成可以使用显式源和目标迁移,但向下迁移不支持同样的操作?
  • 向下迁移脚本生成仅在指定要连接的实际数据库时才有效?
  • 有没有什么方法可以生成向下迁移而无需指定要连接的数据库?
  • 为什么不一致?向下的脚本迁移不是与向上的相反吗?

FWIW,我怀疑迁移工具可能会隐式创建 localdb 或 SQL Server Express 数据库,以便进行显式向上脚本迁移。我不知道这对上面列出的所有内容有何必然影响,也不明白为什么对于显式向下脚本迁移仍然无法完成相同的操作。

任何见解都将不胜感激!