数据库在更新时应用所有以前的迁移,而不仅仅是新迁移
Database applies ALL previous migrations on update and NOT just the new one
我正在开发一个网站,截至目前,该网站同时具有生产数据库和测试数据库。
生产数据库在外部托管,而测试数据库在本地托管。
每当我对数据库进行更改时,我都会通过迁移来应用更改。
添加新迁移后,我 运行 在我的生产和测试数据库上使用 update-database 命令以保持它们同步。
我将迁移很好地应用到我的生产数据库,但是,当我想将迁移应用到我的测试数据库时,我看到它试图应用所有以前的迁移(而不仅仅是新的迁移):
这是输出:
Applying explicit migrations: [201603230047093_Initial,
201603232305269_AddedBlobNameToImage,
201603242121190_RemovedSourceFromRealestateDbTable,
201603311617077_AddedSourceUrlId,
201604012033331_AddedIndexProfileAndFacebookNotifications,
201604012233271_RemovedTenantIndexProfile,
201604042359214_AddRealestateFilter]. Applying explicit migration:
201603230047093_Initial. System.Data.SqlClient.SqlException
(0x80131904): There is already an object named 'Cities' in the
database.
显然它失败了,因为数据库的当前状态是第二个最新的迁移。但是我想知道为什么它会尝试应用所有以前的迁移?
与生产数据库(一次应用所有迁移)不同,测试数据库是在上一次迁移时删除和创建的,因此其迁移历史记录 table 仅包含一行:
201604012239054_InitialCreate
(我假设 InitialCreate 是所有先前迁移组合的自动生成名称)。
总结:
为什么测试数据库试图应用所有以前的迁移而不只是新添加的?
编辑:
当 运行ning 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 语句)
我的数据库中的当前迁移 table 如下所示(请注意,第一行用于日志记录框架,因此不相关):
可能导致迁移重新运行的一个问题是,如果您的上下文键发生更改,这可能会在重构过程中发生。有几种方法可以解决这个问题:
1) 用新值更新 __MigrationHistory 中的旧记录:
UPDATE [dbo].[__MigrationHistory]
SET [ContextKey] = ‘New_Namespace.Migrations.Configuration’
WHERE [ContextKey] = ‘Old_Namespace.Migrations.Configuration’
2) 您可以将旧的上下文键硬编码到迁移配置的构造函数中 class:
public Configuration()
{
AutomaticMigrationsEnabled = false;
this.ContextKey = “Old_Namespace.Migrations.Configuration”;
}
这是一篇关于如何迁移 运行 的好文章:https://msdn.microsoft.com/en-US/data/dn481501?f=255&MSPPError=-2147217396
我正在开发一个网站,截至目前,该网站同时具有生产数据库和测试数据库。 生产数据库在外部托管,而测试数据库在本地托管。
每当我对数据库进行更改时,我都会通过迁移来应用更改。 添加新迁移后,我 运行 在我的生产和测试数据库上使用 update-database 命令以保持它们同步。
我将迁移很好地应用到我的生产数据库,但是,当我想将迁移应用到我的测试数据库时,我看到它试图应用所有以前的迁移(而不仅仅是新的迁移):
这是输出:
Applying explicit migrations: [201603230047093_Initial, 201603232305269_AddedBlobNameToImage, 201603242121190_RemovedSourceFromRealestateDbTable, 201603311617077_AddedSourceUrlId, 201604012033331_AddedIndexProfileAndFacebookNotifications, 201604012233271_RemovedTenantIndexProfile, 201604042359214_AddRealestateFilter]. Applying explicit migration: 201603230047093_Initial. System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'Cities' in the database.
显然它失败了,因为数据库的当前状态是第二个最新的迁移。但是我想知道为什么它会尝试应用所有以前的迁移?
与生产数据库(一次应用所有迁移)不同,测试数据库是在上一次迁移时删除和创建的,因此其迁移历史记录 table 仅包含一行:
201604012239054_InitialCreate
(我假设 InitialCreate 是所有先前迁移组合的自动生成名称)。
总结:
为什么测试数据库试图应用所有以前的迁移而不只是新添加的?
编辑: 当 运行ning 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 语句)
我的数据库中的当前迁移 table 如下所示(请注意,第一行用于日志记录框架,因此不相关):
可能导致迁移重新运行的一个问题是,如果您的上下文键发生更改,这可能会在重构过程中发生。有几种方法可以解决这个问题:
1) 用新值更新 __MigrationHistory 中的旧记录:
UPDATE [dbo].[__MigrationHistory]
SET [ContextKey] = ‘New_Namespace.Migrations.Configuration’
WHERE [ContextKey] = ‘Old_Namespace.Migrations.Configuration’
2) 您可以将旧的上下文键硬编码到迁移配置的构造函数中 class:
public Configuration()
{
AutomaticMigrationsEnabled = false;
this.ContextKey = “Old_Namespace.Migrations.Configuration”;
}
这是一篇关于如何迁移 运行 的好文章:https://msdn.microsoft.com/en-US/data/dn481501?f=255&MSPPError=-2147217396