У меня есть старая клиентская база данных, новое приложение, использующее EF Core (все Code First, новые разные и в основном несовместимые модели). У меня есть код импорта, который выполняет запросы к старой базе данных, затем обрабатывает данные, а затем сохраняет их в новой базе данных.
Большинство PITA использует консоль Package Manager для сброса базы данных при внесении изменений. Да, я знаю, что мне следует сохранять всю историю в последующих миграциях, но она предназначена для использования после развертывания, а не во время разработки, когда я постоянно меняю структуру и отношения, тестирую разные варианты.
Так что мой рабочий процесс включает в себя множество Update-Database 0
/ Update-Database
или удаление вручную файлов миграции, Add-Migration Initial
/ Update-Database
. Было бы просто ужасно c, если бы я мог сделать все это из кода. Я запускаю свое приложение с аргументом import
, затем оно сбрасывает всю структуру базы данных, удаляет все объекты и создает их с нуля. Что ж, учитывая использование тяжелых внешних ключей, было бы очень трудно обновить в противном случае.
Кстати, я также тестирую / тестирую различные RDBMS-ы с этим. Мне удалось вписать все параметры RDBM в мой файл appsettings.json
, поэтому мне нужно изменить только один раздел моего конфигурационного файла, и я готов переключить RDBMS, например, с MS SQL на Postre SQL.
Все работает (включая спецификации RDBMS c hacks), однако использование диспетчера пакетов или Powershell для миграции баз данных утомительно. Я видел приложения, которые применяли миграцию при первом запуске, однако это не будет работать с разными RDBMS. Код, сгенерированный в процессе миграции, кажется другим, если используется другая СУБД.
Как удалить и построить файлы миграции из запущенного приложения? Как обновить базу данных из миграции во время выполнения?
РЕДАКТИРОВАТЬ: Кажется, мало интереса к этому стеку, поэтому мой обходной путь на данный момент PowerShell выполняется во время выполнения с использованием исходного кода. Я использую такие хаки время от времени для автоматизации строительных задач. Занимает дополнительное время, но его можно использовать многократно.