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 中关于 ;
的有趣文章
我有一个 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 中关于;
的有趣文章