Entity Framework Code Только ошибка: модель, поддерживающая контекст, изменилась с момента создания базы данных

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

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

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

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

Ответ 1

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

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 и поэтому не будут иметь хэш... и реализация сегодня будет бросать, если эта таблица отсутствует. Мы будем работать над изменением этого поведения, прежде чем мы отправим версию fial, так как это значение по умолчанию. До тех пор существующие базы данных обычно не нуждаются в инициализаторе базы данных, поэтому его можно отключить для вашего типа контекста, вызвав:

Database.SetInitializer<Production>(null);

Ответ 2

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

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

Database.SetInitializer<YourContext>(null);

в методе Application_Start для Global.asax

Ответ 3

Я прокомментировал это выше, и он работал в то время, когда я просто играл с 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

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

Context:

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

Ответ 5

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