我正在开发一个网站,截至目前,该网站既有生产数据库又有测试数据库。
生产数据库托管在外部,而测试数据库托管在本地。
每当我对数据库进行更改时,我都会通过迁移应用更改。
添加新的迁移后,我运行更新数据库对我的生产和测试数据库执行命令以保持它们同步。
我将迁移很好地应用于我的生产数据库,但是,当我想将迁移应用于我的测试数据库时,我发现它尝试应用所有以前的迁移(而不仅仅是新的迁移):
这是输出:
应用显式迁移:[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):