Обновление базы данных пытается выполнить автоматическую миграцию даже при отключенных автоматических переходах
Я работаю над командой из 4 разработчиков, использующих EF5, каждый из которых работает над собственной локальной базой данных. До сих пор мы использовали автоматическую миграцию, но мы приближаемся к точке, где нам нужно выпустить на производство, поэтому мы отключили автоматическую миграцию и начали добавлять явные миграции на основе кода.
Вот проблема: я запустил команду Update-Database
после того, как разработчик создал новую явную миграцию, и я получаю следующую ошибку:
Applying code-based migrations: [201209080142319_CreatedDate.LastModifiedDate.Additions].
Applying code-based migration: 201209080142319_CreatedDate.LastModifiedDate.Additions.
Applying automatic migration: 201209080142319_CreatedDate.LastModifiedDate.Additions_AutomaticMigration.
Automatic migration was not applied because it would result in data loss.
Почему я получаю эту ошибку, хотя я отключил автоматическую миграцию? Я могу исправить эту ошибку, удалив явную миграцию, а затем повторно запустив ее (запустив Add-Migration
). Затем Update-Database
работает отлично и ничего не говорит о "Автоматическая миграция..." Также, код в миграции, созданный мной при запуске Add-Migration, идентичен тому, который был создан моим партнером по команде. Я не понимаю, почему он даже попытался выполнить автоматическую миграцию с AutomaticMigrationsEnabled = false;
.
Что мне здесь не хватает?
Ответы
Ответ 1
Я ненавижу отвечать на свой вопрос, но снова столкнулся с этой проблемой. Разработчик моей команды повторно активировал автоматическую миграцию на своей локальной машине, а затем создал явную миграцию, которая воспроизвела это поведение, как только я его запустил.
Entity framework будет всегда запускать автоматическую миграцию, прежде чем запускает явную миграцию, у которой есть свойство Source
, определенное в файле .resx
, , даже если AutomaticMigrationsEnabled = false
. Явная миграция будет иметь только свойство Source
, если оно создано после выполнения автоматической миграции.
Результат заключается в том, что отключение автоматических миграций означает, что EF не будет автоматически обновлять вашу схему при обнаружении изменений модели, но она все равно может выполнять автоматическую миграцию, если ей необходимо заполнить пробел между некоторыми явными переходами. Чтобы избежать такого поведения, не используйте смесь автоматических миграций и явных миграций.
Ответ 2
public class Configuration : DbMigrationsConfiguration<bailencasino.com.dal.Context.BlncnoContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = true;
}
Добавьте AutomaticMigrationDataLossAllowed = true;
, чтобы вы предположили, что хотите разрешить EF добавлять удаленные объекты SQL, которые приводят к потере данных.
Ответ 3
AutomaticMigrationEnabled = false
не позволяет вашему приложению обновлять базу данных самостоятельно.
Но так как ваша текущая база данных обновлений сама, Update-Database проверяет текущее состояние базы данных, а затем выполняет все шаги миграции, еще не внесенные в базу данных, включая изменения в модели (dbContext), которые не имеют кода- на основе миграции.
Моя догадка заключается в том, что в модели произошли изменения, которые могут привести к потере данных.
Вы можете использовать параметр -force
, чтобы применить изменения, когда есть потеря данных.
Ответ 4
Моя команда испытала что-то, что может быть связано с этим. Если два члена команды добавляют миграцию, проверяют свой код, получают последние данные, а затем выполняют обновление базы данных, вторая получает ошибку, потому что миграция "пропущена" - их система видит, что миграция члена группы никогда не выполнялась.
Мы начали проверять все и получать последние данные, делая базу данных обновлений (если член команды добавил новую миграцию), затем выполняем добавление-перенаправление, обновление-базу данных, регистрацию.