数据库在更新时应用所有以前的迁移,而不仅仅是新的迁移

2024-03-24

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

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

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

这是输出:

应用显式迁移:[201603230047093_Initial, 201603232305269_AddedBlobNameToImage, 201603242121190_RemovedSourceFromRealstateDbTable, 201603311617077_AddedSourceUrlId, 201604012033331_AddedIndexProfileAndFacebookNotifications, 201604012233271_RemovedTenantIndexProfile, 201604042359214_AddRealstateFilter]。应用显式迁移: 201603230047093_初始。 System.Data.SqlClient.SqlException (0x80131904): 中已经有一个名为“Cities”的对象 数据库。

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

与生产数据库(一次应用了所有迁移)不同,测试数据库是在上一次迁移时删除并创建的,因此其迁移历史表仅包含一行:

201604012239054_InitialCreate 

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

总之:

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

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

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 语句)

The current migrations table in my database looks the following (note that the first row is for a logging framework so it's not related): enter image description here


可能导致迁移重新运行的一个问题是,如果您的上下文键发生更改,这可能会在重构过程中发生。有几种方法可以解决这个问题:

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”;
}

这是一篇关于迁移如何在幕后运行的好文章:

也可以看看http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/ http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库在更新时应用所有以前的迁移,而不仅仅是新的迁移 的相关文章

随机推荐