微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 DevOps 构建管道中使用 EF6.exe 生成带有触发器的脚本

如何解决如何在 DevOps 构建管道中使用 EF6.exe 生成带有触发器的脚本

我想为我的应用程序设置 CI/CD,以便在构建管道中生成 EF 迁移脚本 (.sql) 文件,并从发布管道将该脚本文件执行到 sql Server。

我使用的是 EF 6.4.4。我计划通过构建管道中的以下任务/步骤来完成。

  1. 将项目的构建输出复制到文件夹 EFMigration
  2. 将 EF6.exe 复制到 EFMigration 文件
  3. 运行以下命令生成迁移脚本
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 举报,一经查实,本站将立刻删除。