Миграции используются для того, чтобы поддерживать в консистентном состоянии модель и базу данных. При изменении модели( это может быть добавление новой сущности, ссылки, или изменение отношей между сущностями, добавление ограничений на длину строки, размер числа и т.д) необходиомо выполнить миграцию:
dotnet ef migrations add <Migration Name> -v -c <Context Name> -s <Path to Startup Project>
Migration Name - имя миграции, оно должно быть уникально Context Name - название класса имплементирующего DbContext, используется когда в приложении несколько DbContext'ов Path to Startup Project - путь к папке содержащей Startup(точку входа в приложение), необходимо, когда Context лежит в другой сборке, и нужно явно указать какой проект нужно использовать( сбилдить и запустить), чтобы накатить миграции.
После выполнения этой команды будет создана папка Migrations, в том каталоге, откуда была запущена миграция, по умолчанию миграции должны лежать в папке с Context'ом, имя миграции это - ОтметкаВремениМиграции_ContextName
Пустая миграция:
Up используется при накатывании миграции на базу, Down при откате миграции(как откатить миграцию см. далее)
В папке Migrations будет храниться история всех миграций, каждая миграция создает два файла : Сам файл миграции (имплементирующий Migration) и Designer.cs файл, последний - служебная информация для EF Core
При добавлении каждой миграции изменяется snapshot:
Он нужен для нахождения изменений в модели, сопоставляется snapshot и модель, различия фиксируются в обновленном snapshot'e и создается миграция, чтобы актуализировать базу данных. Поэтому если вы просто удалите одну из миграции, а потом заходите ее снова накатить, то она будет пустой, потому что сравнивается с моделью именно snapshot, а не миграции
Если вы отредактируете snapshot, и накатите миграцию не меняя при этом модель, то данные в миграции будут дублировать одну из миграций ранее(которая внесла изменения в snapshot, которые вы изменили)
Далее нужно обновить базу данных:
dotnet ef database update -v -c <Context Name> -s <Path to Startup Project>
Если это первое накатывание миграций, то в базе будет создана таблица __EFMigrationsHistory
В это таблице просто будут храниться Id миграций, которые уже были накатаны и версия ef core
EF Сore перед обновлением базы данных смотрит в эту таблицу, и определяет какие миграции еще не накатаны на базу, и применяет их
Если вам нужно откатить миграцию, то используйте:
dotnet ef migrations remove -v -c <ContextName> -s <Path to Startup Project>
Но, если миграцию уже применена к базе, то откатить уже не выйдет, в таких нужно откатывать базу, а потом только сам snapshot, это делается так:
dotnet ef database update <Rollback migration name> -v -c <Context Name> -s <Path to Startup Project>
Эта команда удалит отметку о миграции в __EFMigrationsHistory При откате миграции snapshot также изменяется Поэтому не нужно делать это вручную, важно сохранить консистетное состоянии snapshot'a и миграций
что такое Rollback migration name ?