Skip to content

Instantly share code, notes, and snippets.

@eterekhin
Last active August 15, 2020 06:38
Show Gist options
  • Save eterekhin/7e046e459ad1922741aca8b47aeb7307 to your computer and use it in GitHub Desktop.
Save eterekhin/7e046e459ad1922741aca8b47aeb7307 to your computer and use it in GitHub Desktop.
Миграции в EF Core

Миграции в EF Core

Миграции используются для того, чтобы поддерживать в консистентном состоянии модель и базу данных. При изменении модели( это может быть добавление новой сущности, ссылки, или изменение отношей между сущностями, добавление ограничений на длину строки, размер числа и т.д) необходиомо выполнить миграцию:

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 и миграций

@maxofon
Copy link

maxofon commented Aug 15, 2020

что такое Rollback migration name ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment