多个上下文的实体框架迁移脚本故障转移现有的 __MigrationHistory 表

Posted

技术标签:

【中文标题】多个上下文的实体框架迁移脚本故障转移现有的 __MigrationHistory 表【英文标题】:Entity Framwork migration script for multiple contexts fails over existing __MigrationHistory table 【发布时间】:2016-03-16 02:51:08 【问题描述】:

我们有一个项目,其中包含多个 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 表的代码,当您已经运行第一个脚本时,该表显然已经存在。

这是一些边缘情况的错误还是我在这里做错了什么?

提前致谢

【问题讨论】:

【参考方案1】:

编辑:对不起,我看到了关于多个上下文的部分。对于迁移,您可能希望创建一个不同的上下文,该上下文仅用于包含所有表的单个迁移。 Julie Lehrman 有几篇关于有界上下文的文章可能会有所帮助:

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

【讨论】:

以上是关于多个上下文的实体框架迁移脚本故障转移现有的 __MigrationHistory 表的主要内容,如果未能解决你的问题,请参考以下文章

无法生成显式迁移 - 具有多个上下文/配置的实体框架 6.1.3

了解实体框架启用迁移和上下文

实体框架用户和角色管理

实体框架 6 代码优先到 RDS 尝试创建数据库

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

实体框架数据库错误