我有一个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(...);
来手动将分号放入迁移中,但有更好的方法吗?
答案 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;
的有趣文章