Модель, поддерживающая контекст БД, изменилась; Рассмотрите первую миграцию кода
Модель, поддерживающая контекст "MyDbContext", изменилась с момента создания базы данных. Рассмотрите возможность использования First First Migrations для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269).
Почему это происходит? Я буквально только что создал новую базу данных и ничего не изменил, но каждый раз, когда я пытаюсь получить доступ к модели с контроллера, это бросает это.
Edit
Это связано с тем, что я пытался совместно использовать строку соединения (т.е. базу данных) с двумя отдельными объектами.
Ответы
Ответ 1
EF codefirst будет смотреть на ваш DbContext и обнаруживать все объявленные в нем сущности объектов (а также просматривать объекты, связанные с этими объектами, с помощью свойств навигации). Затем он посмотрит на базу данных, в которой вы дали ей строку подключения, и убедитесь, что все таблицы соответствуют структуре ваших объектов в модели. Если они не совпадают, то они не могут читать/записывать эти таблицы. Каждый раз, когда вы создаете новую базу данных или если вы что-то меняете в объявлениях класса сущностей, таких как добавление свойств или изменение типов данных, тогда он обнаружит, что модель и база данных не синхронизированы. По умолчанию он просто даст вам вышеуказанную ошибку. Обычно во время разработки вы хотите, чтобы база данных была воссоздана (очистка любых данных) и сгенерирована снова из вашей новой структуры модели.
Чтобы сделать это, см. "Функция RecreateDatabaseIfModelChanges" в этой статье:
http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx
Вам в основном нужно предоставить инициализатор базы данных, который наследует от DropCreateDatabaseIfModelChanges (RecreateDatabaseIfModelChanges теперь устарел). Для этого просто добавьте эту строку в метод Application_Start
вашего файла Global.asax
.
Database.SetInitializer<NameOfDbContext>(new DropCreateDatabaseIfModelChanges<NameOfDbContext>());
Как только вы перейдете к производству и больше не хотите потерять данные, вы должны удалить этот инициализатор и вместо этого использовать Миграции баз данных, чтобы вы могли развернуть изменения без потери данных.
Ответ 2
В моем случае эта ошибка была вызвана наличием таблицы _MigrationsHistory в базе данных. Удаление этой таблицы устранило проблему. Не знаете, как эта таблица попала в нашу базу данных тестовой среды.
Ответ 3
Чтобы решить эту ошибку, напишите следующий код в методе Application_Start() в файле Global.asax.cs
Database.SetInitializer<MyDbContext>(null);
Ответ 4
Если вы внесли изменения в свой контекст и хотите вручную внести соответствующие изменения в БД (или оставить его как есть), существует быстрый и грязный способ.
Перейдите в DB и удалите все из таблицы "_MigrationHistory"
Ответ 5
Самый простой и безопасный метод
Если вы знаете, что действительно хотите изменить/обновить структуру данных, чтобы база данных могла синхронизироваться с вашим DBC-текстом, самым безопасным способом является:
- Откройте консоль диспетчера пакетов
- Тип: update-database -verbose -force
Это говорит EF о внесении изменений в вашу базу данных, чтобы он соответствовал вашей структуре данных DBContext
Ответ 6
Это происходит, когда структура таблицы и класс модели больше не синхронизируются. Вам необходимо обновить структуру таблицы в соответствии с классом модели или наоборот - это когда ваши данные важны и их не нужно удалять. Если ваша структура данных изменилась и данные не важны для вас, вы можете использовать функцию DropCreateDatabaseIfModelChanges
(ранее известную как функция RecreateDatabaseIfModelChanges
), добавив следующий код в свой Global.asax.cs
Database.SetInitializer<MyDbContext>(new DropCreateDatabaseIfModelChanges<MyDbContext>());
Запустите приложение еще раз.
Как следует из названия, это приведет к сбросу базы данных и воссозданию в соответствии с вашим последним классом модели (или классами) - если вы считаете, что определения структуры таблиц в ваших классах моделей являются самыми актуальными и последними; в противном случае измените определения свойств ваших классов модели.
Ответ 7
Если вы изменили модель и базу данных с уже существующими таблицами, и вы получили сообщение об ошибке "Модель, поддерживающая контекст БД, изменилась; рассмотрите первые миграции Migration", вы должны:
- Удалите файлы в папке "Миграция" в вашем проекте.
- Откройте консоль диспетчера пакетов и запустите
pm>update-database -Verbose
Ответ 8
Entity Framework обнаруживает, что что-то изменило модель, вам нужно что-то сделать для базы данных, чтобы получить эту работу. Решение: 1. enable-migrations 2. обновление-базы данных
Ответ 9
Ты должен мне поверить.
Я получил эту ошибку по той простой причине, что забыл добавить строку подключения в App.Config(мой проект wpf) вашего проекта запуска.
Вся конфигурация в моем случае
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="ZzaDbContext" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=ZaaDbInDepth;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient"/>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
Ответ 10
Эта ошибка возникает, когда ваша база данных не синхронизирована с вашей моделью и наоборот. Чтобы преодолеть это, выполните следующие действия -
а) Добавьте файл миграции, используя add -igration & lt; {Имя файла миграции}> через консоль диспетчера пакетов nuget. Этот файл миграции будет иметь скрипт для синхронизации всего, что не синхронизировано между БД и кодом.
б) Обновите базу данных с помощью команды update-database. Это обновит База данных с последними изменениями в вашей модели.
Если это не помогает, попробуйте выполнить следующие действия после добавления строки кода в методе Application_Start файла Global.asax.cs -
Database.SetInitializer<VidlyDbContext>(new DropCreateDatabaseIfModelChanges<VidlyDbContext>());
Ссылка - http://robertgreiner.com/2012/05/unable-to-update-database-to-match-the-current-model-pending-changes/
Ответ 11
Добавление этого в качестве другого возможного решения, потому что это то, что исправило это в нашем случае;
Если у вас есть несколько проектов, убедитесь, что они используют одну и ту же версию пакета Entity Framework Nuget!
В нашем случае у нас был один проект (вызов, если проект A), содержащий первый контекст кода EF со всеми сущностями. Именно этот проект мы использовали для добавления миграций & обновить базу данных.
Однако второй проект (B) ссылался на проект A, чтобы использовать контекст. При запуске этого проекта мы получили ту же ошибку;
Модель, поддерживающая контекст "MyDbContext", изменилась с момента создания базы данных. Попробуйте обновить Code First Migrations для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269).
Ответ 12
Просто зайдите в Консоль управления пакетами, введите следующее:
Enable-Миграции
* Если появляется такая ошибка, как "Невозможно обновить базу данных, чтобы она соответствовала текущей модели, потому что есть ожидающие изменения, и автоматическая миграция отключена. Запишите изменения ожидающей модели в миграцию на основе кода или включите автоматическую миграцию".
Сделайте это >>> Add-Migration
* Visual studio запросит имя, пожалуйста, введите желаемое имя.
Обновление базы данных
Ответ 13
Вы можете решить эту проблему, удалив таблицу __MigrationHistory
, которая автоматически создается в базе данных и регистрирует любое обновление в базе данных с использованием миграций с первым кодом. Здесь, в этом случае, вы вручную изменили свою базу данных, в то время как EF предполагал, что вам нужно сделать это с помощью инструмента миграции. Удаление таблицы означает для EF, что обновлений нет, и нет необходимости выполнять миграцию кода, поэтому она отлично работает.