Модель, поддерживающая контекст <Database>, изменилась с момента создания базы данных - PullRequest
239 голосов
/ 30 августа 2010

Сообщение об ошибке:

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

Я пытаюсь использовать первую функцию кода, и вот что я написал:

var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
    var contact = new Contact
    {
        ContactID = 10000,
        FirstName = "Brian",
        LastName = "Lara",
        ModifiedDate = DateTime.Now,
        AddDate = DateTime.Now,
        Title = "Mr."

    };
    context.contacts.Add(contact);
    int result = context.SaveChanges();
    Console.WriteLine("Result :- "+ result.ToString());
}

Контекстный класс:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

и строка подключения:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
    <add name="AddressBook" providerName="System.Data.SqlClient"  
         connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
         Integrated Security=True;MultipleActiveResultSets=True;"/>
    </connectionStrings>
</configuration>

Итак, имя базы данных - «Адресная книга», и возникает ошибка, когда я пытаюсь добавить объект контакта в контекст. Я что-то здесь упускаю?

Ответы [ 27 ]

2 голосов
/ 02 января 2014

У меня была эта проблема, и оказалось, что один проект указывает на SQLExpress, а другой - на LocalDb. (в соответствующем web.config). Глупый контроль, но стоит отметить, что если кто-то еще устраняет эту проблему.

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

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

1 голос
/ 10 июля 2017

Ни одно из этих решений не будет работать для нас (кроме полного отключения проверки схемы).В итоге у нас произошел промах в нашей версии Newtonsoft.json

Наш AppConfig не обновился корректно:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>

Решение было исправить версию сборкимы на самом деле развертывали

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
  </dependentAssembly>
1 голос
/ 15 апреля 2017

На всякий случай, если у кого-то такой же сценарий, как у меня.

У меня есть база данных, первая EF и в то же время использующая идентификацию asp.net

поэтому у меня есть две строки подключения в моем webconfig, и с этим нет проблем. Случилось так, что я создал / запустил скрипты для генерации вручную таблиц идентичности asp.net, чего не должно быть.

поэтому УДАЛИТЕ сначала все таблицы идентификации asp.net, созданные вами вручную / из сценариев.

DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers
1 голос
/ 22 августа 2015

Это означает, что в контексте произошли некоторые изменения, которые не были выполнены. Пожалуйста, сначала запустите Add-Migration, чтобы сгенерировать изменения, которые мы сделали (изменения, которые мы могли не знать) А затем запустите Update-Database

1 голос
/ 13 августа 2014

Я использую метод Database.CompatibleWithModel (доступный в EF5), чтобы проверить, совпадают ли модель и БД, прежде чем использовать его.Я вызываю этот метод сразу после создания контекста ...

        // test the context to see if the model is out of sync with the db...
        if (!MyContext.Database.CompatibleWithModel(true))
        {
            // delete the old version of the database...
            if (File.Exists(databaseFileName))
                File.Delete(databaseFileName);
            MyContext.Database.Initialize(true);

            // re-populate database

        }
0 голосов
/ 19 декабря 2012

После некоторых исследований по этой теме я обнаружил, что ошибка возникает в основном, если у вас есть экземпляр db, созданный ранее на вашем локальном сервере sql express.Поэтому, когда у вас есть обновления на БД и вы пытаетесь обновить БД, запускайте некоторый код на БД, не запуская команду Update Database с использованием Package Manager Console;Прежде всего, вы должны удалить предыдущие БД на нашем локальном sql express вручную.

Кроме того, это решение работает, если у вас нет AutomaticMigrationsEnabled = false; в вашей конфигурации.

Если вы работаете с системой контроля версий (git, svn и т. Д.) И некоторые другие разработчики обновляют объекты db на этапе разработки, то эта ошибка возникает всякий раз, когда вы обновляете базу кода и запускаете приложение.

Как указано выше, есть несколько решений для этого на основе кода.Однако для некоторых случаев это наиболее практичный вариант.

0 голосов
/ 25 января 2013

Я тоже читал книгу Pro ASP.NET MVC 4 и столкнулся с той же проблемой, что и у вас.У меня возникла проблема после внесения изменений, предписанных в разделе «Добавление проверки модели» книги.Я решил проблему, перенеся мою базу данных с локальной базы данных на полноценный сервер SQL Server 2012.(Кстати, я знаю, что мне повезло, что я мог перейти на полноценную версию, так что не ненавидите меня. ;-))) Должно быть что-то в связи с БД, которая вызывает проблему.

0 голосов
/ 15 апреля 2016

У меня была такая же проблема, когда мы использовали одну базу данных для двух приложений. Настройка disableDatabaseInitialization="true" в разделе типа контекста работает для меня.

<entityFramework>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
  <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
  </context>
</contexts>

Подробнее https://msdn.microsoft.com/en-us/data/jj556606.aspx

0 голосов
/ 30 января 2014

Изменить Global.asax.cs, включая событие Application_Start:

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());
...