Модель, поддерживающая контекст "-Context", изменилась с момента создания базы данных, но db является новой производственной базой данных
У меня есть эта ошибка в 762-й раз, но на этот раз я получаю ее, как только пытаюсь получить доступ к моему сайту Production, сразу после удаления базы данных "production" на Azure и затем публикации моего сайта.
The model backing the 'PropertyContext' context has changed since the database was created. Consider using Code First Migrations to update the database
Я удалил базу данных, потому что я не мог исправить эту проблему каким-либо другим способом, но она все еще не работает.
Некоторые важные моменты:
и
Database.SetInitializer(new MigrateDatabaseToLatestVersion<PropertyContext, MyConfiguration>());
new PropertyContext().Database.Initialize(true);
Я использую .net 4.5
Почему я получаю эту ошибку в новой базе данных и как я могу заставить этот сайт работать?
Ответы
Ответ 1
Просто напал на ту же ошибку в приложении ASP.Net. В моем случае я не использовал Code First, но я использовал стандартный поставщик аутентификации ASP.Net, который, по-видимому, использует Code First, и аутентификация была нарушена из-за этой проблемы.
Вот быстрое и грязное решение: вам все равно, о существующих пользовательских записях:
Для меня решение было отказаться от таблицы dbo.__MigrationHistory
, после этого аутентификация начала работать нормально. Знайте! Это решение не для всех! Это устранит проблему, но это потенциально опасно.
Если вы не можете потерять данные в таблицах AspNet *:
Поставщик аутентификации ASP.Net автоматически создает таблицы в вашей базе данных:
- AspNetRoles
- AspNetUsers
- AspNetUserRoles
- AspNetUserClaims
- AspNetUserLogings
Таблицы по умолчанию пусты, если вы не создали никаких новых логинов для своего веб-сайта, вы можете использовать "быстрое и грязное" решение выше. Если вы заботитесь о сохранении информации о пользователе или просто о том, как работают миграции кода First, выполните следующие действия:
Update-Database -ConnectionStringName MyConnectionStringName
Замените имя MyConnectionStringName фактическим именем, которое вы искали в web.config.
В результате этой команды вы увидите новую папку "Миграции" с кучей кода, сгенерированной командой Update-Database
. Повторно постройте и повторно разверните приложение, новый код перехода будет выполнен при запуске и приведет к синхронизации схемы базы данных с обновленной версией кода поставщика проверки подлинности ASP.Net.
Ответ 2
При использовании Code First with Migrations ваша база данных создает таблицу с именем __MigrationHistory
для отслеживания текущей схемы. Когда вы запустите приложение, Entity Framework проверит эту таблицу, чтобы убедиться, что схема базы данных соответствует вашим объектам базы данных. Если они не совпадают, вы получите эту ошибку.
Чтобы обновить базу данных, выполните следующие действия:
- Откройте консоль диспетчера пакетов (View → Other Windows → Package Manager Console) в Visual Studio
- В окне консоли диспетчера пакетов есть выпадающее меню с вашими проектами, убедитесь, что он установлен в проект, содержащий ваш
DbContext
- Убедитесь, что проект, содержащий ваш файл
App.Config
/Web.Config
, - "Установить как проект запуска" (если у вас несколько конфигураций, он должен быть указан с строкой соединения с базой данных.
- Введите
Update-Database -ConnectionStringName MyConnString
где MyConnString
- это имя (а не фактическая строка подключения) вашей строки подключения в App.Config
/Web.Config
Если вы получите такую ошибку: "Невозможно обновить базу данных, чтобы она соответствовала текущей модели, потому что есть ожидающие изменения, и автоматическая миграция отключена".
Вы должны включить автоматическую миграцию и повторите попытку.
Чтобы включить автоматическое перемещение
- В папке
Migrations
(в проекте с вашим DbContext
) откройте Configuration.cs
.
- Убедитесь, что конструктор содержит:
AutomaticMigrationsEnabled = true;
Чтобы остановить Entity Framework/DbContext от мониторинга изменений в вашей базе данных, вы можете просто удалить таблицу __MigrationHistory
в своей базе данных. Тогда вам нужно убедиться, что база данных обновляется вручную.
Статья MSDN здесь
Ответ 3
Решение этого - использовать статический метод SetInitializer и привязать к контексту значение Null. Если вы работаете над веб-решением, наилучшим положением для написания кода является Application_Start вашего файла Global.asax.cs.
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
//...
Database.SetInitializer<MyContext>(null);
}
Ответ 4
У меня такая же проблема сегодня утром. Внезапно возникла ошибка и ее невозможно было решить:
The model backing the 'ApplicationDbContext' context has changed since
the database was created. Consider using Code First Migrations to update
the database
У меня есть один проект для MVC и еще один проект для модели, контекста и репозиториев. Я работаю над этим несколько недель, но сегодня он сказал, что остановился.
Я пытался удалить базу данных, включить-перенаправить, добавить-перенаправить и обновить-базу данных столько раз, сколько потерял счет. Я добавил инициализаторы в MigrateDatabaseToLatestVersion, а также DropCreateDatabaseIfModelChanges. Все напрасно...
Что в конечном итоге заставило его работать. заключалось в том, чтобы перемещать модель, контекст и репозитории в проект MVC (не то, что я увлекался)... тогда он работал прямо из коробки без каких-либо изменений кода (кроме пространства имен)! Очень странно...
Я читал так много сообщений в блоге в течение дня, пытаясь решить эту проблему. Один из них (я не знаю, какой из них) упомянул ошибку в Visual Studio 2013, где ссылка на файлы DLL не всегда обновлялась, как и следовало ожидать, что мой проект MVC пропустил что-то, когда я запускал add-migration и update -база в моем отдельном проекте. Но это просто предположение.
Я использую EF 6.1 и .Net 4.5.1 в своем решении.
Ответ 5
Получена аналогичная проблема! Ответ здесь
http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc3/cs/adding-a-new-field
(Рик Андерсон)
Существует два подхода к разрешению ошибки:
-
Учтите, чтобы Entity Framework автоматически удаляла и воссоздавала базу данных на основе новой схемы классов модели. Этот подход очень удобен при активной разработке тестовой базы данных, поскольку он позволяет быстро развернуть модель и схему базы данных. Однако недостатком является то, что вы теряете существующие данные в базе данных - поэтому вы не хотите использовать этот подход в производственной базе данных!
-
Явно изменить схему существующей базы данных так, чтобы она соответствовала классам модели. Преимущество такого подхода заключается в том, что вы сохраняете свои данные. Вы можете внести это изменение вручную или путем изменения базы данных script.
Ответ 6
Я потратил несколько часов, пытаясь решить эту проблему. Один проект работал, другой - нет.
У меня были разные проекты, ссылающиеся на разные версии Entity Framework
. В моем случае у меня было приложение Консоль и приложение Windows Service, ссылающееся на третий проект, содержащий первые классы кода и DbContext
.
После запуска Update-Package EntityFramework
в обоих проектах все отлично работало.