Выполнение C# (процедурных) миграций с DbUp
Используя DbUp, возможно ли написать процедурную миграцию на C# (а не на SQL)?
Я понимаю, что общая философия DbUp - делать все на SQL, но могут быть случаи, когда C# - лучший инструмент для работы.
Например, предположим, что вы храните сериализованные двоичные двоичные объекты в вашей базе данных (игнорируя, хорошая это идея или нет), и вы хотите изменить структуру этих двоичных объектов. В коде вашего приложения есть ноу-хау для десериализации / сериализации этих BLOB-объектов. Это может быть возможно с помощью SQL, но сделать это с помощью C# будет проще.
Есть ли способ сделать это (кроме IScript
)? В основном я ищу механизм для
- Разрешить ввод произвольных команд для базы данных в контексте транзакции
- Если переход завершен успешно, запишите, что "миграция" завершена
IScript
кажется, самое близкое из того, что есть - интересно, есть ли что-то лучше.
1 ответ
Да - см. https://dbup.readthedocs.io/en/latest/usage/
Сценарии, основанные на коде Иногда для миграции может потребоваться больше логики, чем просто или возможно выполнить в одном только SQL. Сценарии на основе кода предоставляют возможность генерировать SQL в коде с открытым подключением к базе данных и предоставленной фабрикой System.Data.IDbCommand.
Миграция на основе кода - это класс, который реализует интерфейс IScript. Метод ProvideScript() вызывается, когда очередь выполнения миграции, поэтому сценарии до того, как он уже был выполнен.
Конечно, фабрика команд может использоваться не только для запросов. Вся миграция может быть выполнена в коде:
public class Script0006UpdateInCode : IScript { public string ProvideScript(Func<IDbCommand> commandFactory) { var command = commandFactory(); command.CommandText = "CREATE TABLE [dbo].[Foo]( [Name] NVARCHAR(MAX) NOT NULL )"; command.ExecuteNonQuery(); return ""; } }