EF6 迁移合并到脚本中

EF6 migrations merged in script

我有一个 Entity Framework 6 迁移,它将一列添加到 table 和 运行s 一些 SQL 以使用正确的数据填充新列.迁移如下:

AddColumn("SiteBranches", "SiteId", c => c.Int(nullable: false, defaultValue: 0));

Sql(@"WITH WithSiteId AS
            (
                --get the relevant data
            )
            UPDATE SiteSurvey.SiteBranches
            SET SiteId = x.SiteId
            FROM (
                --use WithSiteId
            ) x
            WHERE SiteBranches.SiteBranchId = x.SiteBranchId;");

如果我 运行 使用 "Update-Database" 进行迁移,它工作正常,并且两个命令分别执行。但是,如果我使用 "Update-Database -script" 它会生成以下 SQL:

ALTER TABLE [SiteBranches] ADD [SiteId] [int] NOT NULL DEFAULT 0
WITH WithSiteId AS
(
   --etc etc.
)

运行 此脚本将其视为单个命令,而不是两个单独的命令。我可以通过在 ALTER TABLE 命令后加一个分号来轻松解决这个问题,但我担心的是脚本将来会由其他人生成以部署到不同的环境,而他们不知道这样做。

有没有一种方法可以编写将这些命令分开的迁移?我可以通过将 AddColumn(...); 替换为 Sql("ALTER TABLE ... ;"); 来手动将分号放入迁移中,但是有更好的方法吗?

你应该像这样把 ; 放在 SQL 的开头

Sql(@";WITH WithSiteId AS
            (
                --get the relevant data
            )
            UPDATE SiteSurvey.SiteBranches
            SET SiteId = x.SiteId
            FROM (
                --use WithSiteId
            ) x
            WHERE SiteBranches.SiteBranchId = x.SiteBranchId;");

这是因为 WITH 和 Common Table 表达式要求使用 ;.

终止前面的语句

如果您使用 AddColumn 添加 2 列,如下例所示,生成的脚本不会导致错误,因为 ; 是可选的。

AddColumn("SiteBranches", "SiteId", c => c.Int(nullable: false, defaultValue: 0))
AddColumn("SiteBranches", "SiteCode", c => c.Int(nullable: false, defaultValue: 0))

Aaron Bertrand 在 sqlblog

上 SQL Server 中关于 ; 的有趣文章