Как стать автором
Обновить

Комментарии 11

Статья конечно хорошая, но хотелось бы видеть полную картину по работе с миграциями, так сказать — для новичков.
Ну документации по работе с миграциями хватает. Статей тоже. Хоть на метаните даже. Я попытался рассказать о том, о чем другие молчат.
О да, еще боль, когда на проде несколько экземпляров приложения работает. Самая боль происходит, когда они начинают запускаться одновременно.
Это у вас масштабирование такое? Кстати да, к вопросу о том, стоит ли стартовать миграции при старте приложения. Если планируется масштабировать, то, пожалуй, нет.
Да, все в кубере вертится

Мой опыт использования миграций EF и EFCore показывает что применение миграций к БД непосредственно из основного приложения рано или поздно приведёт к проявлению граблей. Имеет смысл написать отдельную утилиту для менеджмента БД. И в ней уже проводить миграции, чистку, заполнение исходными данными. А основное приложение должно "падать" в случае проблем с БД.


Если уж решение требует использования миграций в основном приложении, то, опять же, опыт показывает, что EFCore в процессе создания новой миграции должна использовать свои стандартные механизмы для формирования объекта контекста БД по средствам либо:


  • метода CreateHostBuilder в классе точки входа;
  • реализации интерфейса IDesignTimeDbContextFactory.
Мой опыт подсказывает мне то же самое.
Я под миграции сделал проект (не целиком только под, конечно). Действительно, тогда проще всего реализовать дизайн-фабрику контекста. Но вот настройки (из основного проекта, appsettings*.json) пришлось подключать через ссылку с копированием в выходной каталог. тогда dotnet ef все найдет и сама фабрика БД найдет. Наверное, не очень элегантно, зато максимально прозрачно и без своего инструмента. Если есть способ лучше получить настройки, буду рад услышать. Бест практис считаю как раз идемпотентные скрипты, как у автора.
Подскажите, пожалуйста, с увеличением кодовой базы, увеличивается и размер файла design.cs миграции. Вплоть до того, что там уже 10к+ строк. Из-за этого очень тормозит сборка. Можно как то уменьшить размер файла, либо вовсе избавиться от него?

в файле design.cs хранится снапшот на момент применения миграции. После отката миграции файл снапшот заменяется содержимым файла дизайн для предпоследней миграции (последняя же удаляется). Уменьшить его нельзя. Однако, если у вас очень большая БД, вы можете рассмотреть вариант разделения контекстов.

Например, контекст пользователей, контекст товаров и контекст заказов. Конечно, в этом случае использование данных будет отличаться. У вас уже не будет связи от сущности заказ к сущности пользователь (только по идентификатору), а значит вы не сможете в один запрос найти заказы всех пользователей с именем Иван. Но зато у каждого контекста будут свои миграции.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории