Как использовать EF6.exe для создания сценария с триггерами в конвейере сборки DevOps

#sql-server #entity-framework #azure-devops #ef-code-first #entity-framework-migrations

Вопрос:

Я хочу настроить 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 Я смог успешно сгенерировать скрипт с помощью вышеуказанной команды. Однако для каждой таблицы в моей базе данных есть триггеры. И сценарий создания выдает ошибку в строке создания триггера. Он выдает ошибку «Неправильный синтаксис рядом с ключевым словом «ТРИГГЕР»» в строке СОЗДАНИЯ ТРИГГЕРА. Кроме того, он показывает ошибку «Неправильный синтаксис рядом с «Началом». Ожидание ВНЕШНЕГО». Пожалуйста, найдите фрагмент сценария ниже.

Является 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?

Комментарии:

1. Вы пробовали это: github.com/dotnet/ef6/issues/1409#issuecomment-547083626