Миграция в командных средах

При работе с миграциями в командной работе возникают различные проблемы, когда несколько разработчиков добавляют миграции одновременно. Обратите внимание, что миграции — это не просто скрипты SQL, но и снимок состояния модели на момент этой миграции.

Например, представьте, что разработчики A и B одновременно создают рабочие ветки и генерируют миграции в своих ветках. Если разработчик A объединяет свою ветвь, а затем разработчик B выполняет то же самое, последняя миграция (разработчик B) будет иметь моментальный снимок контекста, который не включает изменения из миграции разработчика A. Это может привести к различным формам повреждения в последующих миграциях.

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

Обнаружение разветвленных миграционных деревьев

Замечание

Эта функция представлена в EF Core 11, начиная с предварительной версии 3.

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

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

Разрешение расхождения миграционных деревьев

Если при слиянии ветви обнаружено расхождение в дереве миграций, устраните его, повторно создав миграцию. Выполните следующие действия:

  1. Прервать слияние и откат к рабочему каталогу перед слиянием
  2. Удалите миграцию (но сохраните изменения модели)
  3. Слияние изменений товарища по команде в рабочий каталог
  4. Повторно добавьте миграцию

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