我们有一个包含多个EntityFramework上下文的项目,每个上下文都启用了迁移。现在,当我们使用Update-Database -SourceMigration $initialDatabase -script
创建完整的迁移脚本时,我们会根据上下文获取脚本。
但是这个脚本的开头是这样的:
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'Some.Configuration.Here'
) AS [Project1]
ORDER BY [Project1].[MigrationId] DESC)
IF @CurrentMigration IS NULL
SET @CurrentMigration = '0'
IF @CurrentMigration < '201506111916518_InitialCreate'
BEGIN
...
<migration code here>
...
END
请注意它是如何使用ContextKey获取当前迁移的,如果它找不到它,它将进行第一次迁移。
事情变得多毛,因为第一次迁移包含创建__MigrationHistory
表的代码,当你已经运行第一个脚本时,这个表显然已经存在。
这是一些边缘案例错误还是我在这里做错了什么?
提前致谢
答案 0 :(得分:0)
https://msdn.microsoft.com/en-us/magazine/dn948104.aspx
https://msdn.microsoft.com/en-us/magazine/jj883952.aspx?f=255&MSPPError=-2147217396
该命令创建一个幂等脚本,该脚本将运行所有必要的迁移以使您及时更新。因此,对于没有__MigrationHistory表的空白数据库,它将设置@CurrentMigration ='0'并运行创建表以及所有其他表的第一次迁移。如果数据库确实存在各种迁移,则它会运行少于目标数据库中已有的最高迁移的迁移。因此命名约定(yyyyMMddHHmmss_xxxxx)。
请参阅https://msdn.microsoft.com/en-us/data/jj591621.aspx?f=255&MSPPError=-2147217396#idempotent