J. *_*Doe 5 database entity-framework database-migration ef-migrations entity-framework-6
我正在开发一个网站,截至目前,它都有一个生产和测试数据库.生产数据库在外部托管,而测试数据库在本地托管.
每当我对数据库进行更改时,我都会通过迁移来应用更改.添加新迁移后,我在生产和测试数据库上运行update-database命令以使它们保持同步.
我将迁移应用到我的生产数据库中,但是,当我想将迁移应用到我的测试数据库时,我发现它尝试应用所有以前的迁移(而不仅仅是新的迁移):
这是输出:
应用显式迁移:[201603230047093_Initial,201603232305269_AddedBlobNameToImage,201603242121190_RemovedSourceFromRealestateDbTable,201603311617077_AddedSourceUrlId,201604012033331_AddedIndexProfileAndFacebookNotifications,201604012233271_RemovedTenantIndexProfile,201604042359214_AddRealestateFilter].应用显式迁移:201603230047093_Initial.System.Data.SqlClient.SqlException(0x80131904):数据库中已有一个名为"Cities"的对象.
显然它失败了,因为数据库的当前状态是第二次最新迁移.但是我想知道为什么它会尝试应用以前的所有迁移?
与生产数据库(已一次应用一个迁移)不同,测试数据库已在先前的迁移中删除并创建,因此其迁移历史记录表仅包含一行:
201604012239054_InitialCreate
Run Code Online (Sandbox Code Playgroud)
(我假设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'
Run Code Online (Sandbox Code Playgroud)
(它继续进行每个先前迁移的语句)
可能导致迁移重新运行的一个问题是,您的上下文密钥会在重构期间发生更改.有几种方法可以解决这个问题:
1)使用新值更新__MigrationHistory中的旧记录:
UPDATE [dbo].[__MigrationHistory]
SET [ContextKey] = ‘New_Namespace.Migrations.Configuration’
WHERE [ContextKey] = ‘Old_Namespace.Migrations.Configuration’
Run Code Online (Sandbox Code Playgroud)
2)您可以将旧的上下文密钥硬编码到迁移配置类的构造函数中:
public Configuration()
{
AutomaticMigrationsEnabled = false;
this.ContextKey = “Old_Namespace.Migrations.Configuration”;
}
Run Code Online (Sandbox Code Playgroud)
这是一篇关于迁移如何运行的好文章:https://msdn.microsoft.com/en-US/data/dn481501?f = 255&MSPPError = -2147217396