数据库应用所有先前的更新迁移而不仅仅是新的

时间:2016-04-06 17:28:31

标签: database entity-framework entity-framework-6 database-migration ef-migrations

我正在开发一个网站,截至目前,它都有一个生产和测试数据库。 生产数据库在外部托管,而测试数据库在本地托管。

每当我对数据库进行更改时,我都会通过迁移来应用更改。 添加新迁移后,我在生产和测试数据库上运行 update-database 命令,以使它们保持同步。

我将迁移应用到我的生产数据库中,但是,当我想将迁移应用到我的测试数据库时,我发现它尝试应用所有以前的迁移(而不仅仅是新的迁移):

这是输出:

  

应用显式迁移:[201603230047093_Initial,   201603232305269_AddedBlobNameToImage,   201603242121190_RemovedSourceFromRealestateDbTable,   201603311617077_AddedSourceUrlId,   201604012033331_AddedIndexProfileAndFacebookNotifications,   201604012233271_RemovedTenantIndexProfile,   201604042359214_AddRealestateFilter。应用显式迁移:   201603230047093_Initial。 System.Data.SqlClient.SqlException   (0x80131904):已有一个名为“城市”的对象   数据库中。

显然它失败了,因为数据库的当前状态是第二次最新迁移。但是我想知道为什么它会尝试应用以前的所有迁移?

与生产数据库(一次只应用一个迁移)不同,测试数据库已删除并在上一次迁移时创建,因此其迁移历史记录表只包含一行:

201604012239054_InitialCreate 

(我假设InitialCreate是所有先前迁移的自动生成名称)。

总结:

为什么测试数据库会尝试应用以前的所有迁移而不仅仅是新添加的?

编辑: 运行COMMMAND时,我得到以下输出脚本:

DECLARE @CurrentMigration [nvarchar](max)

IF object_id('[dbo].[__MigrationHistory]') IS NOT NULL
    SELECT @CurrentMigration =
        (SELECT TOP (1) 
        [Project1].[MigrationId] AS [MigrationId]
        FROM ( SELECT 
        [Extent1].[MigrationId] AS [MigrationId]
        FROM [dbo].[__MigrationHistory] AS [Extent1]
        WHERE [Extent1].[ContextKey] = N'Boligside.Migrations.Configuration'
        )  AS [Project1]
        ORDER BY [Project1].[MigrationId] DESC)

IF @CurrentMigration IS NULL
    SET @CurrentMigration = '0'

IF @CurrentMigration < '201603230047093_Initial'

(它继续为每个先前的迁移制作if语句)

我的数据库中的当前迁移表如下所示(请注意,第一行是针对日志记录框架的,因此它不相关): enter image description here

1 个答案:

答案 0 :(得分:8)

可能导致迁移重新运行的一个问题是,您的上下文密钥会在重构期间发生更改。有几种方法可以解决这个问题:

1)使用新值更新__MigrationHistory中的旧记录:

UPDATE [dbo].[__MigrationHistory]
   SET [ContextKey] = ‘New_Namespace.Migrations.Configuration’
 WHERE [ContextKey] = ‘Old_Namespace.Migrations.Configuration’

2)您可以将旧的上下文密钥硬编码到迁移配置类的构造函数中:

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    this.ContextKey = “Old_Namespace.Migrations.Configuration”;
}

以下是一篇关于迁移如何运行的好文章:https://msdn.microsoft.com/en-US/data/dn481501?f=255&MSPPError=-2147217396

另见http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/