Пишут ли обратные скрипты для миграций при написании кода роллбека для базы данных
Что проверяют
Что вы делаете, когда релиз надо развернуть обратно, а миграция уже применена. EF Core генерирует метод Down сам, поэтому интересен не факт его наличия, а понимаете ли вы, что откат схемы почти никогда не возвращает данные.
Как отвечать
Разделите случаи. Обратимые: добавление таблицы, колонки, индекса. Здесь Down симметричен и откат честный. Необратимые по данным: удаление колонки, сужение типа, слияние таблиц. Здесь Down вернёт структуру, но содержимое уже потеряно, и это надо произносить вслух, а не прятать за словом «роллбек».
Отсюда рабочая практика: делать миграции совместимыми с обеими версиями кода, чтобы откат приложения не требовал отката базы. Новое поле добавляется как nullable, код начинает писать в оба места, данные переносятся, чтение переключается, старое поле удаляется отдельным релизом спустя время. Тогда откат это возврат предыдущего образа приложения, а база остаётся рабочей для обеих версий.
Технически стоит назвать: dotnet ef migrations script собирает идемпотентный скрипт для прода, и его читают глазами перед выкаткой, а dotnet ef database update с именем предыдущей миграции откатывает. Для собственного SQL внутри миграции (migrationBuilder.Sql) обратный код автоматически не появится, его пишут руками.
И про проверку: последовательность вверх, вниз, вверх прогоняется на копии базы с боевым объёмом. Непроверенный скрипт отката это код, который никто ни разу не выполнял, а выполнять придётся в худший момент.
Где спотыкаются
Оставляют Down пустым или бросают исключение «не реализовано». Узнают об этом во время инцидента, когда выбор уже сузился до восстановления из копии.
Второе: считают, что откат вернёт состояние. Удалённая колонка возвращается пустой, ограничение NOT NULL на неё поставить нечем, а прежняя версия приложения ждёт там значения.
Третье: применяют миграции автоматически при старте сервиса. Несколько экземпляров стартуют одновременно и дерутся за одну блокировку, а откат приложения тут же накатывает миграцию заново. На проде это отдельный шаг выкатки.