EF6迁移在脚本中合并

时间:2015-04-30 09:38:33

标签: sql-server entity-framework entity-framework-6 ef-migrations

我有一个Entity Framework 6迁移,它向表中添加一列并运行一些SQL以使用正确的数据填充新列。迁移如下:

a

如果我使用" Update-Database"运行迁移,它可以正常工作,并且两个命令都是单独执行的。但是,如果我使用" Update-Database -script"它生成以下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;");

运行此脚本会将此视为单个命令,而不是两个单独的命令。我可以通过在ALTER TABLE [SiteBranches] ADD [SiteId] [int] NOT NULL DEFAULT 0 WITH WithSiteId AS ( --etc etc. ) 命令之后放置一个分号来轻松解决这个问题,但我担心的是,该脚本将来会被其他人生成,以便部署到不同的环境中,并且他们不会我知道这样做。

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

1 个答案:

答案 0 :(得分:3)

您应该将;放在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和公用表表达式要求使用;终止先前的语句。

如果您使用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 ;的有趣文章