具有上下文密钥更改的脚手架迁移

时间:2014-12-15 12:37:14

标签: c# entity-framework ef-code-first entity-framework-6 ef-migrations

我重新构建了我的项目,导致更改了数据库上下文的命名空间名称和相关的Code First配置。那时,我有一个脚手架迁移," InitialCreate"因此,我的数据库的__MigrationHistory表包含一行,其中一些MigrationId和一个ContextKey包含Configuration类的命名空间名称和类名。

在我移动了一些内容后,执行Get-Migrations后,根据我的同事的建议更改了ContextKey后,ContextKey没有返回任何结果," InitialCreate"正确列举了迁移。

在更改过程中我应该采取哪些步骤,以便我的迁移的连续性没有被破坏,从而无需手动重命名{{1}}?显然,对于一次应用迁移来说,这没什么大不了的,但对于数十次应用迁移来说,这是一件非常痛苦的事。

3 个答案:

答案 0 :(得分:13)

我被困在这里已经很长时间了,并且问了一个问题here。在EF文档中,您可以找到有关上下文键here的说明。您应该创建这样的自定义迁移配置:

 public class MyMigrationConfiguration : DbMigrationsConfiguration<MyMigrationContext>
{
    public MyMigrationConfiguration ()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = false;
        MigrationsNamespace = "My.Migrations.Assembly";
        MigrationsDirectory = "My/Migrations/Directory";
        ContextKey = "MyContexKey"; // You MUST set this for every migration context
    }
}

答案 1 :(得分:3)

我已经了解到DbMigrationsConfiguration{TDbContext}类有一个名为ContextKey的属性(EF6及其“多租户迁移”功能),它允许我显式设置上下文密钥。如果我在程序包管理器控制台中使用Enable-Migrations命令的-ContextTypeName参数,则会设置此属性。

在应用第一次迁移后似乎不能更改上下文密钥,但是在配置类类型名称更改后,可以选择以这种方式设置上下文密钥,如果可以的话,几乎没有必要容忍数据库中的一些差异。

答案 2 :(得分:3)

我有两个独立的数据库项目 - 一个包含模型和映射,另一个只包含迁移配置和所有迁移。我已将包含迁移的项目合并到包含模型等的项目中

最后,通过执行这些步骤,我解决了无法添加新迁移或使数据库保持最新或将模式迁移到以前状态的问题:

  • 我将合并项目中的命名空间更改为所有迁移,并将配置本身更改为新的命名空间值。
  • 我对数据库执行了以下语句:

    USE [DatabaseName]
    
    GO
    
    UPDATE [dbo].[__MigrationHistory]
       SET [ContextKey] = N'NewNamepacePlusConfigurationClassName'      
     WHERE ContextKey= N'NamepacePlusConfigurationClassName'
    
    GO
    
  • 我使用配置

  • 构建包含迁移的项目

现在一切都按预期工作,我甚至可以使用语句

向后更改架构
Update-Database -TargetMigration PreviousMigration