#sql-server #entity-framework #azure-devops #ef-code-first #entity-framework-migrations
Вопрос:
Я хочу настроить CI/CD для своего приложения для создания файла сценария миграции EF (.sql) в конвейере сборки и выполнения этого файла сценария на SQL Server из конвейера выпуска.
Я использую EF 6.4.4. Я планирую сделать это с помощью следующих задач/шагов в конвейере сборки.
- Копирование результатов сборки проектов в папку EFMigration
- Копия EF6.exe в папку EFMigration
- Выполните приведенную ниже команду для создания сценария миграции
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