Миграции платформы Entity Framework - управление веткими

Я использую первые миграции интерфейсов Entity Framework в течение некоторого времени в совершенно новом проекте, и они до сих пор отлично работали в основной версии приложения.

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

Например (я, очевидно, упростил их для обсуждения):

Отрасль A: Разработчик 1 добавляет миграцию Add-UserDateCreated, которая добавляет поле в объект User. Файл миграции содержит код для добавления поля и состояние модели в это время.

Филиал B: Разработчик 2 добавляет миграцию "Add-UserMiddleName", которая добавляет другое поле в объект User. Файл миграции содержит код для добавления поля и состояние модели в это время (но у него, очевидно, нет поля, добавленного в другую миграцию).

Эти миграции работают нормально на своих ветках, но когда вы объедините их обратно в багажник, вы застряли:

  • Вы не можете просто сохранить отдельные файлы миграции, поскольку состояние сохраненной модели будет неправильным. Например, миграция "Add-UserMiddleName" ДОЛЖНА иметь состояние модели с добавленным полем "Add-UserDateCreated", но оно не будет.
  • Вы не можете объединить миграцию в один файл, поскольку вы попали в ту же проблему *

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

Итак, как другие люди управляют такими ситуациями? Мне было бы интересно узнать мнение других народов.

* Мне любопытно, какие проблемы это действительно вызовет в реальном мире, если кто-нибудь знает?

Ответ 1

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

Итак, в вашем примере разработчики A и B должны общаться друг с другом. Разработчик B, понимая, что требуется миграция, должен проверить, были ли выполнены другие миграции и объединить их с ее веткой, прежде чем создавать миграцию "среднего пользователя".

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

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

Следует также отметить, что он помогает использовать систему управления версиями, которая хороша с разветвлением, слиянием и выбором вишни, например, Git.