问题描述
我想为我的应用程序设置 CI/CD,以便在构建管道中生成 EF 迁移脚本 (.sql) 文件,并从发布管道将该脚本文件执行到 sql Server。
我使用的是 EF 6.4.4。我计划通过构建管道中的以下任务/步骤来完成。
ef6.exe database update --source 0 --script --verbose --no-color --prefix-output --assembly eAuditService.dll --language C# --root-namespace eAuditService --config ..\Web.config
通过这些步骤,脚本在 cmd 屏幕上生成但是我无法将此脚本写入文件。如果我从 Visual Studio 包管理器运行相同的命令,它会按预期生成脚本并在 VS 中打开脚本文件(我想在构建管道中执行相同的操作)。我试图将命令输出通过管道传输到一个文件 (--script > EFMigration.sql) 但是 生成的文件有很多不需要的东西,比如每个迁移文件名和“信息:”和“数据的详细信息” :" 每行前缀。因此,我无法执行此脚本。
在 GitHub 上他们提到没有计划进行任何额外的更改https://github.com/dotnet/ef6/issues/1409
更新:1 使用以下命令,我能够生成脚本并从脚本中删除不需要的文本(仍在尝试合并命令以使用单个命令执行相同的操作)。
.\ef6 database update --assembly MyProject.dll --source 0 --script --verbose --no-color --language C# --root-namespace MyProject --config ..\Web.config --prefix-output > MyProject_Output.txt
select-string .\MyProject_Output.txt -pattern "^data:" | foreach {$_.Line.Substring(9)} | out-file -filepath MyProject_EFMigration.sql
更新:2 我能够使用上述命令成功生成脚本。但是,我的数据库中的每个表都有触发器。并且生成脚本在 Create Trigger 行上引发错误。它会在 CREATE TRIGGER 行上抛出错误“关键字 'TRIGGER' 附近的语法不正确”。此外,它在“'Begin' 附近的语法不正确。期待 EXTERNAL”上显示错误。请在下面找到脚本片段。
EF6.exe 是否无法在有触发器的情况下生成具有正确语法的脚本? (当然,我有解决这个问题的方法,但我认为 EF6.exe 可能有办法处理它?)
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'MyProject.Migrations.Configuration'
) AS [Project1]
ORDER BY [Project1].[MigrationId] DESC)
IF @CurrentMigration IS NULL
SET @CurrentMigration = '0'
IF @CurrentMigration < '202008040522393_Initialize'
BEGIN
CREATE TABLE [dbo].[Activities] (
[Id] [nvarchar](128) NOT NULL DEFAULT NEWID(),[Title] [nvarchar](max),[ActivityTypeId] [nvarchar](128),[ActivityPhaseId] [nvarchar](128),[Deleted] [bit] NOT NULL,CONSTRAINT [PK_dbo.Activities] PRIMARY KEY NONCLUSTERED ([Id])
)
CREATE TRIGGER [TR_dbo_Activities_InsertUpdateDelete] ON [dbo].[Activities] AFTER INSERT,UPDATE,DELETE AS BEGIN UPDATE [dbo].[Activities] SET [dbo].[Activities].[UpdatedAt] = CONVERT(DATETIMEOFFSET,SYSUTCDATETIME()) FROM INSERTED WHERE inserted.[Id] = [dbo].[Activities].[Id] END
CREATE INDEX [IX_ActivityTypeId] ON [dbo].[Activities]([ActivityTypeId])
CREATE INDEX [IX_ActivityPhaseId] ON [dbo].[Activities]([ActivityPhaseId])
有触发器时,有没有办法使用EF6.exe生成脚本?或 EF 6.4.4 的任何其他替代方案?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)