Невозможно создать явную миграцию в структуре сущностей

96

Я добавляю новую миграцию, но это сообщение показывает:

Невозможно сгенерировать явную миграцию, так как ожидают следующие явные миграции: [201203170856167_left]. Примените ожидающие явные миграции перед попыткой создать новую явную миграцию.

Может кто-нибудь помочь мне?

Номан Саид
источник
11
Это случилось со мной, когда я случайно переключил свой стартап-проект на другой. Вы (или другие, читающие это), возможно, захотите быстро это проверить, прежде чем пытаться более подробно устранить неполадки (особенно те, где вам нужно начать удаление миграций и т. Д.).
NicholasFolk
В каталоге Migrations есть класс миграции, который не обновляется в _MigrationHistory базы данных. Удаление этого класса с одинаковым состоянием как в каталоге миграции, так и в базе данных решило мою проблему.
Ариан Фирузиан
1
Это случается со мной случайно. Когда это происходит, это показывает, что нужно применить все мои миграции. Мне нужно перезапустить Visual Studio, чтобы она заработала, потому что у меня все уже настроено правильно.
Ларри Флевеллинг,

Ответы:

81

Он сообщает вам, что в вашем приложении есть необработанная миграция, и ее необходимо запустить, Update-Databaseпрежде чем вы сможете добавить еще одну миграцию.

Ладислав Мрнка
источник
12
Что вы хотите воссоздать при первоначальной миграции? Это мешает вам это сделать?
Ребекка
У меня не сработало, Update-Database только что выдало еще одну ошибку. Сначала мне пришлось удалить ожидающие файлы.
Vahx
1
Ответ Томаса оказался полезным для моего аналогичного случая.
Тарек Шавадфи
2
Возможно, нужно будет объявить стартап-проект-StartupProject ContentHub.Database
Osanger
2
Update-Databaseдает> Невозможно обновить базу данных для соответствия текущей модели из-за ожидающих изменений
Аспирин
53

У меня такая же проблема. По-видимому, entity framework генерирует эту ошибку, когда не может подключиться к базе данных. Поэтому убедитесь, что у вас есть доступ к нему, прежде чем искать другие проблемы.

Робин Дорбелл
источник
1
Я бы также добавил, что это будет тот случай, когда вы перемещаете свой App.config в другой проект, или если он просто отсутствует в вашем проекте, или если он находится в вашем проекте, но настроен неправильно.
Code Maverick,
Я получил ту же ошибку после изменения моего IP (произошло как после переключения местоположения, так и после изменения dyn dns). Это привело к тому, что брандмауэр в базе данных Azure, которую мы используем, отозвал логин. Бесполезно миграция EF дает указанную выше ошибку вместо «не удалось войти в систему» ​​...
Виктор
8
Еще один момент, который я хотел бы отметить, - убедиться, что ваш запускаемый проект соответствует строке подключения вашего контекста базы данных. У меня возникла эта проблема, когда я временно изменил свой запускаемый проект и не понял, что другой проект не имеет той же строки подключения.
Gage Trader
Добавление в @GageTrader: у меня было несколько запускаемых проектов, один без конфигурации и веб-проект с EF-config. проект (Репозиторий) с миграциями имеет ту же конфигурацию EF в файле app.config, что и веб-проект. но даже когда я выбрал проект репозитория в качестве проекта запуска, он не работал, но когда я установил запуск веб-проекта, он работал.
JimiSweden,
Мне пришлось явно указать параметр -ConnectionString, что помогло мне
Брайан Колавито
34

Вам либо нужно запустить «update-database» из консоли диспетчера пакетов, чтобы отправить изменения в базу данных, либо вы можете удалить файл ожидающей миграции ([201203170856167_left]) из папки Migrations, а затем повторно запустить «add-migration» в создайте новую миграцию на основе ваших правок.

сокетник
источник
1
Я удалил файл миграции и запустил add-migration, но он по-прежнему дает ту же ошибку.
nu everest
2
Спасибо, совет об удалении ожидающего файла миграции был спасением
Маниш
31

Эта ошибка также может означать, что миграции больше не распознаются. Это случилось со мной после того, как я изменил значение ContextKey в Migrations.Configuration. Решением было просто обновить ContextKey в таблице базы данных «__MigrationHistory» (или, я думаю, вернуть значение в классе Configuration). ContextKey и пространство имен в вашем приложении должны совпадать.

Томас
источник
1
Это был правильный ответ для моего случая. Поскольку я использовал один из моих старых проектов для нового аналогичного проекта, я не мог вносить изменения в БД через старые миграции. Как предположил Томас, пространство имен в Migrations отличалось от Contextkey в таблице _MigrationsHistory, из-за чего старые миграции не распознавались.
Тарек Шавадфи
1
Это помогло мне, потому что я вызвал проблему, переименовав решение. В процессе я переименовал ContextKey, чтобы он больше не соответствовал записям _MigrationHistory.
Joel
Также у меня сработало, установил явный ключ контекста в конфигурации, изменил его в __MigrationHistory и update-database решил, что все было круто. Спасибо!
Джеймс Уайт
2
Смешно, но правильно. Если вы обновили имя проекта или если вы разделили свой проект (в моем случае) на несколько и пытаетесь добавить новую миграцию из нового проекта в ту же базу данных, вы должны использовать правильный ContextKey, вы можете установить его в конструкторе конфигурации ( вы должны использовать ключ контекста, который есть в таблице __MigrationHistory в целевой БД)
BotanMan
то же самое здесь, я переименовал свое пространство имен по умолчанию и заменил его во всем своем решении, которое вызвало эту проблему
WtFudgE
19

1. Строка подключения / разрешения для подключения

Еще раз проверьте строку подключения.

Убедитесь, что у пользователя, с которым вы подключаетесь, все еще есть разрешение на чтение[__MigrationHistory] и разрешение на редактирование схемы.

Вы также можете попробовать изменить строку подключения в файле конфигурации приложения или веб-сайта, чтобы использовать встроенную безопасность (Windows Auth) для запуска команды добавления-миграции от имени себя. .

Например:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

Эта строка подключения будет помещена в файл App.config проекта, в котором расположен DbContext.

2. StartUp Project

Вы можете указать проект StartUp в командной строке или можете щелкнуть проект правой кнопкой мыши с папкой DbContext, Configurationи Migrations и выбрать Set as StartUp project . Я серьезно, это действительно может помочь.

введите описание изображения здесь

Джесс
источник
Ха-ха. Я бы хотел, чтобы это набрало больше голосов. Со мной такое случается часто, и Integrated Securityисправление отлично работает!
Джесс
1
У меня была такая же проблема, ни одна из команд миграции не работала. Оказывается, виноват не запускаемый проект. Установка, которая устранила мою проблему.
Vishal
Смена стартап-проекта у меня сработала! Я был уверен, что это не сработает, но все равно попробовал, так как все остальное не удалось. Отличный ответ.
Сильвен Родриг
«Установить как автозагрузку» - никогда бы не догадалась! Спасибо!!
Jasel
1
Да, я намеренно изменил стартап-проект и забыл вернуть его обратно. И забавно, что одна миграция раньше была сделана с правильным запуском проекта, поэтому все работало нормально. Но теперь это логично - b / c EF берет строку подключения из проекта, таким образом, он «не знает», что миграции на самом деле уже применяются к БД ...
косист
8

Имел ту же проблему и смог решить с некоторыми подсказками из приведенных выше ответов:

  • В консоли диспетчера пакетов проверьте проект по умолчанию (укажите на проект с конфигурацией миграции
  • Убедитесь, что в start-proj есть файл web.config с допустимой строкой подключения (или
  • Убедитесь, что в проекте с миграциями есть файл app.config / web.config с допустимой строкой подключения.
  • Проверьте разрешения в БД (для пользователя, настроенного в вашей строке подключения)

Используйте «update-database -verbose» в консоли диспетчера пакетов, чтобы получить более конкретную информацию, к которой пытается подключиться миграция. (Помогло в моем случае узнать, что мой стартап-проект настроен неправильно ...)

сгибать
источник
2
запустил «update-database -verbose» и заметил, что моя строка подключения не работает, лол. Таким образом, команда add-migration выдает неправильное сообщение.
Wachburn
4
"Убедитесь, что стартап-проект {...}" решил мою проблему. Спасибо @flex
Энди Шмитт
7

Если вы еще не использовали, Update-Databaseвы можете просто удалить его. Если вы запустили обновление, откатите его, используяUpdate-Database -TargetMigration "NameOfPreviousMigration" , а затем удалите.

Ссылка: http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/

Я скопировал этот текст прямо отсюда: Как мне отменить последнюю команду Add-Migration?

ню Эверест
источник
7

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

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

Куда:

Delta_Defect_0973 - это имя вашей миграции

your.namespace.ContextClassName - это имя вашего класса конфигурации в папке миграции с префиксом полного пространства имен.

DeltaProject - это имя вашего основного проекта с файлом web.config или app.config.

DeltaSQL - это имя строки подключения, определенной в файле web.config или app.config.

Ив Рошон
источник
Спасибо. Это мне действительно помогло.
Джесс,
Кроме того, если вы используете в своем решении внедрение зависимостей, вам может потребоваться выбрать другой проект по умолчанию в консоли диспетчера пакетов. Если EF не может найти ваши миграции, попробуйте выбрать проект, который действительно содержит миграции, в качестве проекта по умолчанию.
Ив Рошон
5

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

  1. Выполните ожидающие миграции с помощью команды Update-Database.
  2. Удалите ожидающие миграции. Самый безопасный способ - открыть папку Migrations, щелкнуть правой кнопкой мыши на [201203170856167_left]> Исключить из проекта.

После этого вы можете снова запустить «Add-Migration ...»

Надеюсь, поможет

Hung Vu
источник
4

Всего два цента:

Мой сценарий:

  1. Я восстановил свою локальную базу данных до рабочего состояния.
  2. К нему уже были применены миграции.
  3. Всякий раз, когда я пытался добавить новую миграцию, я получал сообщение об ожидающих миграциях, как упоминалось в моем OP.

Решение:

Чтобы обойти это, я просто предоставил более явные параметры:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

Я считаю, что вы можете установить настройку в своей папке app.config, чтобы позволить вам использовать это поведение по умолчанию, чтобы вам не приходилось каждый раз указывать явные параметры. Однако я не уверен, как это сделать.

ИбрарМумтаз
источник
1
У меня это сработало, я просто добавил имя миграции в конец команды, показанной выше.
sfors требует восстановить Монику на работе
1
=) - рад, что смог помочь.
ИбрарМумтаз
1
-ConnectionStringNameявляется альтернативой этому и будет извлекать строку подключения из вашей конфигурации по имени
Simon_Weaver
1
Это помогло мне, потому что я не сохраняю строку подключения в файле конфигурации
Sasinosoft
3

Есть двусмысленность и так ошибка. Лучший способ - исключить текущий файл миграции и создать новый файл миграции ( добавить-миграцию ), а затем скопировать содержимое новой миграции в исключенный файл, снова включить его и запустить команду update-database .

Сачин Чолкар
источник
Я просто update-databaseвыполнил add-migrationкоманду, а затем повторил ее, и она сработала
Смитти-Вербен-Ягер-Мандженсон
3

Я решил такую ​​же проблему:

  • удалить старый файл миграции
  • update-database -force
  • Add-Migration AddedEntity
  • обновление базы данных
Йилмаздинцой
источник
1

У меня были те же проблемы, и я смог решить их только с помощью Add-Migration 'MigrationName' -Force

С -Force является важной частью.

Эван Барк
источник
1

В моей локальной базе данных не было ни __MigrationHistoryзаполненных, ни существующих. Я вручную создал таблицу, а затем перенес данные в этой таблице из PROD в мою локальную базу данных. Это заставило VS подумать, что миграции были применены (что так и было).

контакты
источник
У меня была такая же проблема, я объединил свою живую БД в производственную, но поэтому история миграции была потеряна.
Мэти
1

Совет: всегда полезно использовать -Scriptпереключатель для команд миграции, если вы не уверены. Это также действительно помогает понять, чтоUpdate-Database самом деле происходит.

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

Ибо Update-Databaseя бы запустил следующее:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

куда SQL_AzureLive указанная строка подключения в моем config.

Затем я могу проверить, выглядит ли SQL правильно, применить его и готово. Как говорили многие другие, если строка подключения неверна или недействительна, вы получите эту ошибку.

Simon_Weaver
источник
1

Для меня я удалил файл миграции (в вашем случае «201203170856167_left») из Migrationsпапки, а затем выполнил следующую команду в консоли диспетчера пакетов

Add-Migration <Parameter>
Update-Database
Сурендра Мурья
источник
0

Сценарий

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

Проблема

После обновления с мастера я запускаю «Add-Migration my_migration_name», но получаю следующую ошибку:

Невозможно создать явную миграцию, так как ожидают следующие явные миграции: [201607181944091_AddExternalEmailActivity]. Примените ожидающие явные миграции перед попыткой создать новую явную миграцию.

Итак, я запускаю «Update-Database» и получаю следующую ошибку:

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

Решение

На этом этапе повторный запуск «Add-Migration my_migration_name» решил мою проблему. Моя теория состоит в том, что при запуске «Update-Database» все было в том состоянии, в котором оно было необходимо для работы «Add-Migration».

Тод Бердсолл
источник
0

Я тоже столкнулся с этой проблемой. Это произошло, когда я создал новую БД, и у меня были отложенные изменения для моей миграции БД с первым кодом, и я попытался запустить команду «Update-Database». Решение: Выполните команду «Add-Migration -MigrationName», чтобы создать новую миграцию для новой БД. Затем запустите команду «Обновление-База данных».

Притам
источник
0

У меня тоже была эта проблема с базой данных, которая, как я знал, была актуальной при запуске Add-Migration. Решается простым повторным запуском команды Add-Migration. Подозрение на проблему с подключением, как было предложено Робином Дорбеллом выше.

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

Это произошло, когда я внезапно переименовал класс старой миграции, который уже существует в db. Я проверил историю VCS, определил это и переименовал обратно. Потом все заработало.

Доктор Кодер
источник
0

Я поступил иначе. Я полностью отбросил базу данных и снова запустил update-database в vs.

Гадир Фарзане
источник
Это не дает надежного решения; действительная миграция сохраняет существующую структуру.
Ferdipux
0

У меня была проблема попроще. VS ошибочно сообщил об этой ошибке, когда у меня было VPN-соединение с клиентским сайтом, подключенным на моей рабочей станции. Проблема заключалась в том, что защита СУБД была настроена на прием запросов только с моего реального локального IP. Простое отключение VPN решило проблему.

лопатки
источник
0

В моем случае я забыл добавить свой IP-адрес в правила брандмауэра в Azure, поскольку мне не удалось подключиться к базе данных, я получал эту ошибку. Поэтому специально для моего случая я добавил свой IP-адрес в правила брандмауэра базы данных в Azure, и все это сработало. Кроме того, это может быть проблема с прокси / подключением к Интернету / паролем имени пользователя БД / строкой подключения к БД и т. Д. ИЛИ, очевидно, у вас могут быть ожидающие миграции, для которых вам нужно запустить команду Update-Database.

Сиддхартх Сачдева
источник
0

Исторически я всегда решал эту проблему, удаляя ожидающие миграции, или, если оставалась только 1, и это было наиболее желательно, используя -fдля ее воссоздания.

В последнее время у меня это перестало работать.

Когда это произошло в первый раз, я перезапустил Visual Studio, и тогда я смог продолжить.

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

Адам Маршалл
источник
0

Для многих это не ответ, но EF устранит эту ошибку, если не сможет подключиться к БД. Если вы работаете из дома, как я, убедитесь, что вы все еще подключены к своей VPN!

Кодирование
источник
-1

У меня возникла точно такая же проблема сразу после возврата от миграции к другой.

В моем случае я «нацелен на миграцию» с «migration06» на «migration04».

Мне нужно было удалить «migration0» 6, а затем я смог принудительно создать «migration05». По сути, это означает, что вам нужно просто сохранить следующую миграцию после целевой.

Гонзо345
источник
-1

В моем случае (с использованием MS Visual Studio) это было так же просто, как перезапустить Visual Studio.

AGuyCalledGerald
источник