Jeer
@Jeer
уверенный пользователь

Пoдскажите базовые правила работы с миграциями в asp.net?

Добрый день!
Разбираюсь с миграциями в Entity Framework .net. Приведу пример с метанита, что я делаю:
https://metanit.com/sharp/entityframework/3.12.php
Во всех таких руководствах обозначены базовые вещи, с которыми вопросов не возникает.
Но если мы копнем даже на этом ресурсе комментарии, то становится понятно, что вылезают не очевидные проблемы разного рода. Вот, примерно, как обычно получается у меня:
Пока проект голый, я создаю таблицы, добавляю миграции, всё хорошо.
Когда проект становится чуть сложнее, особенно, когда приходят другие участники, начинается полный треш.
К примеру, я начинаю делать какой-то функционал, таблица уже создана ранее, я добавляю столбец, делаю миграцию, запускаю код, понимаю, что есть какой-нибудь констрейнт, которого быть не должно, сношу, делаю миграцию, прокатываю на базу (да, работаю с локальной базой). Затем понимаю, что нужен еще один столбец, делаю еще миграцию. Даже больше того, я понимаю, что мне всё-таки нужен столбец, который я удалил, возвращаю и прокатываю миграцию еще раз. В это время другому участнику понадобился в этой таблице свой новый столбец, он так же его добавляет, мигрирует. Вообще ничерта не соберёшь после такого. Даже если у другого участника нет изменений по этой таблице, в мастер с моей ветки заливается куча файлов. Он делает волшебный update-database и всё встаёт раком. Хотя у меня работает. Очевидно, что механизм не понимает, какой из файлов надо первым прокатывать. Дальше начинается какое-то рукоблудное сношение с имеющимися файлами, попытки как-то это всё уладить. Кто-то психует, удаляет все миграции, все таблицы из контекста, делает миграцию, добавляет одну новую InitMigration чистенькую, ровненькую, но... у кого-то эта хрень не работает, пересоздание базы, поджигание сервера, государственный переворот и содомия. При том, что всегда начинается всё красиво, но буквально через пару итераций начинается разбор конфликтов миграций.
И тут я задаюсь вопросом, возможно, мы что-то делаем неправильно? Но хорошей инфы по этой теме я как-то найти не могу. Один знакомый, на заданный мной вопрос - чистят ли они миграции, ну, удаляют ли старые созданные, пересоздают и т.д., так как на каждый чих создаётся файл в мапке migrations и в будущем там вообще не разобраться, ответил, примерно, "а что они тебе, мешают"? Ну да, мешают. Треш какой-то регулярно с ними получается.
Могу предположить, что есть какие-то базовые правила, что-то вроде "на одну таблицу держать один файл миграций и добавлять в него всю инфу" - но я не уверен, как себя поведёт механизм EF при обновлении, сможет ли он отследить изменения. В общем, господа, как вы работаете с EF и миграциями?

P.S. в работе мы не пользуемся такими миграциями, я либо вручную пишу sql скрипт, типа alter table add newcolumn и эту строчку прокатываю на всех нужных базах сразу. Либо товарищ сторонним инструментом, удобным, сверяет базы и синхронизирует изменения. После добавления столбцов в базе мы либо автогенерацией перегенерируем файлы в контексте EF, либо, если это просто один столбец, вообще его руками добавляем. Минусы тут очевидны и я хотел научиться правильно работать с EF, но вот прям засада какая-то.
  • Вопрос задан
  • 205 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Проблемы все те же, что и для ручных миграций, только пишутся они сами и все действия фиксируются в миграциях.

Как вариант решения: коммитить все миграции, ничего не откатывая. Когда пришла пора мержиться выше (из таск-бранча в стори-бранч, из стори-бранча в фичу, из фичи в девелоп, из девелопа - в релиз/мастер или что у вас там) - приводим в порядок миграции: удаляем промежуточные, делаем одну новую миграцию - финальную и мержим. И так для каждого мержа с изменением схем. Таким образом, у нас каждый мерж в релиз/мастер будет означать максимум одну миграцию, что выглядит вполне адекватно.

Процесс "приведения в порядок" можно закриптовать, поэтому сильно большой проблемой это не должно быть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы