Entity Framework Code Only error: модель, поддерживающая контекст, изменилась с момента создания базы данных - PullRequest
50 голосов
/ 24 августа 2010

Я создал POCO «Только код» для использования в существующей базе данных с использованием Entity Framework 4 и CTP4.Когда я запускаю запрос, я получаю сообщение об ошибке

Модель, поддерживающая контекст 'xyzContext', изменилась с момента создания базы данных.Либо удалите / обновите базу данных вручную, либо вызовите Database.SetInitializer с экземпляром IDatabaseInitializer.Например, стратегия RecreateDatabaseIfModelChanges автоматически удалит и заново создаст базу данных и при необходимости заполнит ее новыми данными.

Мне неясно, почему это происходит или что я могу изменить.Я просто создал POCO, определил простой DbContext, сделал несколько настроек, а затем попытался выполнить простой запрос.Поскольку я использую «Только код», мне неизвестны какие-либо параметры конфигурации, которые необходимо выполнить.И я, конечно же, не хочу воссоздавать или удалять базу данных, поскольку она уже существует.

Спасибо за любые идеи.

Ответы [ 5 ]

77 голосов
/ 24 августа 2010

Я нашел ответ в комментариях к этому посту в блоге Скотта Гатри.

http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx

Для тех, кто видит это исключение:

"Модель, поддерживающая контекст« Производство », изменилась с момента создания базы данных. Либо удалите / обновите базу данных вручную, либо вызовите Database.SetInitializer с экземпляром IDatabaseInitializer."

Вот что происходит и что с этим делать:

Когда модель впервые создается, мы запускаем DatabaseInitializer для создания таких вещей, как создание базы данных, если ее там нет, или добавление начальных данных. DatabaseInitializer по умолчанию пытается сравнить схему базы данных, необходимую для использования модели, с хешем схемы, хранящейся в таблице EdmMetadata, которая создается с базой данных (когда Code First создает базу данных). Существующие базы данных не будут иметь таблицы EdmMetadata и, следовательно, не будут иметь хеша ... и реализация сегодня выбросит, если эта таблица отсутствует. Мы поработаем над изменением этого поведения, прежде чем отправлять конечную версию, поскольку она используется по умолчанию. До тех пор существующие базы данных обычно не нуждаются в инициализаторе базы данных, поэтому его можно отключить для вашего типа контекста, вызвав:

Database.SetInitializer<Production>(null);
31 голосов
/ 22 января 2011

Это ошибка в CTP4 для использования EF с уже существующими базами данных.

Вы можете это исправить, позвонив по номеру:

Database.SetInitializer<YourContext>(null);

в методе Application_Start файла Global.asax

13 голосов
/ 22 марта 2013

Я прокомментировал выше, и это сработало в то время, когда я просто играл с EF5, чтобы познакомиться с его работой.Сейчас я пишу «реальный» код, и я отошел от установки инициализатора базы данных для контекста в коде из-за архитектуры, в которой я остановился на использовании MEF для создания экземпляра любого DbContext и внедрения всех зависимостей конфигурации в качестве компонуемых частей.

Итак, я снова столкнулся с ошибкой, описанной выше, но на этот раз я решил ее устранить, используя записи в файле конфигурации, как показано ниже.

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <contexts>
      <context type="Basd.Erp.ContactContext, Basd.Erp" disableDatabaseInitialization="true"></context>
    </contexts>
  </entityFramework>

Таким образом, установив disableDatabaseInitialization = "true" в разделе конфигурационного файла для entityFramework, вы сможете преодолеть описанную выше ошибку, и поскольку ее нет в коде, одним из преимуществ является возможность "более простого" использованияабстрактные строители / фабрики для создания контекста.

4 голосов
/ 14 июня 2016

Все, что мне нужно было сделать, это сбросить таблицу __MigrationHistory.

Контекст:

Я получил эту ошибку, когда изменил имя таблицы. После того, как я добавил аннотацию [Table("NewTableName")] к одной из моих моделей, Entity Framework сгенерировал таблицу __MigrationHistory.

1 голос
/ 30 сентября 2016

У меня была та же проблема - повторное добавление миграции и обновление базы данных не работало, и ни один из ответов выше не показался правильным.Затем меня поразило вдохновение - я использую несколько уровней (один веб, один данные и один бизнес).Веб-слой никогда не создавал этого исключения - это был бизнес-уровень (который я установил как консольное приложение для тестирования и отладки).Оказывается, бизнес-уровень не использовал правильную строку соединения, чтобы получить базу данных и создать контекст.Поэтому я добавил строку подключения в конфигурацию приложения, и она работает.Поместите это здесь для тех, кто может столкнуться с той же проблемой.

...