Бекенд на C# Web Api

To Kaiten

Миграция базы данных

Как посмотреть БД

Для просмотра и ручного редактирования БД можно использовать программу DBeaver.

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

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

Подробно про Flow миграции описано по тут: Microsoft — Code First Migrations in Team Environments.

Как произвести миграцию

Установка NuGet пакетов

В первую очередь необходимо установить следующие NuGet пакеты:

Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore

Важно, чтобы пакеты были одинаковых версий

Изменение Dockerfile

Затем нужно дополнить Dockerfile:

  • sdk — корректируем образ.

  • USER root — указываем пользователя с root правами.

  • COPY .. — копируем исходные файлы внутрь контейнера. Они понадобятся при сборке внутри контейрера.

  • dotnet-ef — устанавливаем и настраиваем утилиту dotnet-ef. С помощью этой утилиты применяется миграция.

Пример готового докерфайла смотрите тут.

Команды для копирования:

USER root

COPY . .

RUN dotnet new tool-manifest
RUN dotnet tool install dotnet-ef
ENV PATH="$PATH:/root/.dotnet/tools"

Создание миграции

Все нижеприведенные команды создание файлов миграции выполняются на локальной машине (там где разрабатывается приложение), а не на сервере.

Открываем консоль и переходим в папку где находится Dockerfile. Выполняем следующую команду:

dotnet ef migrations add InitialCreate --project ./Entities/Entities.csproj --startup-project ./DemoWebApi/DemoWebApi.csproj

Рассмотрим детальнее эту команду:

  • dotnet ef — пользуемся утилитой dotnet-ef.

  • migrations add — добавляем новую миграцию.

  • InitialCreate — имя миграции.

  • --project — путь до файла проекта *.csproj, в котором находится описание базы данных. В демо-проекте структура имеет вид, как на картинке ниже. Описание БД находится в проекте Entities.csproj, поэтому указываем путь до файла этого проекта.

  • --startup-project — путь до файла проекта, из которого запускается приложение (там где находится файл Program.cs).

После выполнения команды выше в консоли должно быть выведено Done.

Также в проекте должны появиться автоматически сгенерированные файлы миграции.

Не удаляйте файлы миграции и всегда храните их в проекте.

Можно также проверить что миграция действительно существует, выполнив команду, которая выводит список всех миграций.

dotnet ef migrations list --project ./Entities/Entities.csproj --startup-project ./DemoWebApi/DemoWebApi.csproj

Применение миграции к БД на сервере

После создания файлов миграции нужно заново залить все приложение на VPS и заново задеплоить. После повторного запуска теперь внутри контейнера с WebApi приложением будут лежать все файлы проекта и файлы миграции (благодаря команде COPY . .). Теперь надо зайти внутрь контейнера и ввести команду для применения миграции.

  • Входим в контейнер используя команду ниже. Вместо 1aef6560f7f0 вводите id контейнера с WebApi.

docker ps # просматриваем контейнеры и их ID
docker exec -it 1aef6560f7f0 bash # входим в файловую систему контейнера
  • После входа вводим следующую команду, чтобы проверить что есть не применённая миграция:

dotnet ef migrations list --project ./Entities/Entities.csproj --startup-project ./DemoWebApi/DemoWebApi.csproj

Должен вывестись список миграций. Также видим, что миграция InitialCreate находится в статусе ожидания.

  • Затем вводим следующую команду чтобы применить миграцию:

dotnet ef database update --project ./Entities/Entities.csproj --startup-project ./DemoWebApi/DemoWebApi.csproj

Вывод должен быть таким:

Проверка

Заходим в DBeaver и проверяем, что в базе данных появились все таблицы и связи, описанные в приложении на C# WebApi. Помимо наших таблиц добавится еще одна служебная таблица __EFMigrationsHistory, в которой будет храниться история всех миграций.

Не удаляйте и не редактируйте таблицу __EFMigrationsHistory

Повторные обновления БД

Для того чтобы еще раз обновить базу данных нужно проделать все те же шаги. Каждый раз, когда меняется структура таблиц, или добавляются новые таблицы, перед тем как залить все изменения на сервер нужно создать новый файл миграции. Затем залить обновленное приложение на сервер и применить миграцию на сервере. Таким образом, будет храниться история всех миграций в виде файлов миграций и служебной таблицы в БД.


Ссылки

Microsoft — Code First Migrations in Team Environments


Автор документа: Артём Ветик