Сообщение об ошибке:
«Модель, поддерживающая контекст« Адресной книги », изменилась с момента создания базы данных. Либо удалите / обновите базу данных вручную, либо вызовите 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>
Итак, имя базы данных - «Адресная книга», и возникает ошибка, когда я пытаюсь добавить объект контакта в контекст. Я что-то здесь упускаю?
.net
entity-framework-4
code-first
Ашиш Гупта
источник
источник
Ответы:
Теперь это:
в вашем файле YourDbContext.cs.
источник
Вот некоторая информация из блога Скотта Гу, опубликованного Джеффом, о том, что на самом деле происходит:
источник
Invalid object name 'dbo.Table
проверку вашей строки подключения attachDbFilename и начального каталогаДля Entity Framework 5.0.0.0 - 6.1.3
Вы DO действительно хотите сделать следующее:
Да, Мэтт Фрир прав. ОБНОВЛЕНИЕ -EDIT: Предостережение в том, что я согласен с другими в том, что вместо добавления этого кода в global.asax, добавляемый в ваш класс DbContext
Как уже упоминалось, это также хорошо для тестирования модулей.
В настоящее время я использую это с Entity Framework 6.1.3 /.net 4.6.1
Я вернусь, чтобы предоставить фрагмент кода в ближайшем будущем.
источник
Просто запустите следующую команду sql в SQL Server Management Studio:
источник
Это исправление больше не работает после CTP5.
Ты должен сделать
Database.SetInitializer<YourContext>(null);
источник
Просто узнал ответ и подумал об обновлении здесь. Просто нужно сделать следующее.
источник
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
не помогает ситуация. DbDatabase.SetInitialzer (нуль); работает.Или вы можете поместить эту строку в свой файл Global.asax.cs в Application_Start ():
Убедитесь, что изменили ProjectName.Path.Context на ваше пространство имен и контекст. Если сначала использовать код, это приведет к удалению и созданию новой базы данных при каждом изменении схемы.
источник
Я потратил много дней, чтобы решить эту проблему, проанализировал много разных постов, перепробовал много вариантов и, наконец, исправил. Это 2 проекта в моем решении с использованием кода EF для первой миграции:
Я получил эту ошибку при запросе WebApi ...
Моя среда:
Здесь я собрал все замечания, на которые следует обратить внимание, и все условия / требования, которые должны быть выполнены, чтобы избежать упомянутого исключения:
Имя строки подключения, например, MyConnectionString в файле конфигурации запускаемого проекта (Web.config / App.config):
должен быть равен параметру, переданному в конструкторе вашего DbContext:
И главное, что решило мою проблему: это странно, но в моей папке WebApi / bin DataModel.exe был старым, не обновленным с момента последней сборки. Так как миграции были встроены в мою сборку DataModel.exe, тогда моя WebApi обновила базу данных, используя старые зеркала. Меня смутило, почему после обновления базы данных в WebApi она не соответствует последнему скрипту миграции из DataModel. Следующий код автоматически создает (если не существует) или обновляет локальную базу данных последней миграции в моей папке WebApi / App_Data.
Я попытался очистить и перестроить решение, но оно не помогло, чем полностью удалил папки bin и obj из WebApi, удалил файлы базы данных из WebApi / App_Data, собрал, перезапустил WebApi, сделал запрос к нему, он создал правильную базу данных - ленивая инициализация (используя строки выше), что соответствует последней миграции и исключение больше не появлялось. Итак, это может решить вашу проблему:
источник
Для меня с обновлением до 4.3.1 я просто усекаю таблицу EdmMetaData или просто удаляю ее напрямую.
источник
Для разработчиков VB.NET:
Добавьте следующую строку в файл Glabal.asax.vb в конце метода Application_Start ()
Измените ApplicationDbContext на ваш конкретный контекст БД.
источник
У меня была эта проблема, и оказалось, что один проект указывал на SQLExpress, а другой - на LocalDb. (в соответствующем web.config). Глупый надзор, но стоит отметить, что если кто-то еще устраняет эту проблему.
источник
Это означает, что в контексте произошли некоторые изменения, которые не были выполнены. Пожалуйста, сначала запустите Add-Migration, чтобы сгенерировать изменения, которые мы сделали (изменения, которые мы могли бы не знать), а затем запустите Update-Database
источник
У меня была та же самая проблема - повторное добавление миграции и обновление базы данных не работало, и ни один из ответов выше не казался правильным. Затем меня поразило вдохновение - я использую несколько уровней (один веб, один данные и один бизнес). Уровень данных имеет контекст и все модели. Веб-уровень никогда не создавал этого исключения - это был бизнес-уровень (который я установил как консольное приложение для тестирования и отладки). Оказывается, бизнес-уровень не использовал правильную строку соединения, чтобы получить базу данных и создать контекст. Поэтому я добавил строку подключения в конфигурацию приложения бизнес-уровня (и уровня данных) и сделал это. Положите это здесь для тех, кто может столкнуться с той же проблемой.
источник
Я использую метод Database.CompatibleWithModel (доступный в EF5), чтобы проверить, соответствуют ли модель и БД, прежде чем я его использую. Я вызываю этот метод сразу после создания контекста ...
источник
Хорошее предложение, однако, не так точно во всех случаях. Я понял один. Пожалуйста, убедитесь, что вы запускаете «enable-migrations», используя окна PM в Visual Studio, и папка Migration будет добавлена в ваш проект.
Убедитесь, что два файла класса c #, добавленные в папку, будут содержать все ваши модели и их соответствующие свойства.
Если у вас есть все это, создайте решение и опубликуйте его для развертывания.
Логика заключается в том, что существующие метаданные не могут быть перезаписаны, поскольку в вашем приложении нет метаданных для замены текущих. В результате вы получаете эту ошибку «Модель, поддерживающая контекст, изменилась с момента создания базы данных»
источник
На всякий случай, если у кого-то такой же сценарий, как у меня.
У меня есть база данных EF и в то же время с использованием идентичности asp.net
поэтому в моем webconfig есть две строки подключения, и с этим проблем нет. Случилось так, что я создал / запустил скрипты для генерации вручную таблиц идентификации asp.net, чего не следует делать.
поэтому сначала удалите все таблицы идентификаторов asp.net, созданные вами вручную / из сценариев.
источник
Ни одно из этих решений не будет работать для нас (кроме полного отключения проверки схемы). В итоге у нас был промах в нашей версии Newtonsoft.json
Наш AppConfig не был обновлен правильно:
Решение состояло в том, чтобы исправить версию сборки на ту, которую мы фактически развертывали
источник
После некоторых исследований по этой теме я обнаружил, что ошибка возникает в основном, если у вас есть экземпляр db, созданный ранее на вашем локальном сервере sql express. Поэтому всякий раз, когда у вас есть обновления на БД и вы пытаетесь обновить БД / запускать некоторый код на БД без запуска
Update Database
команды usingPackage Manager Console
; Прежде всего, вы должны удалить предыдущие БД на нашем локальном SQL Express.Кроме того, это решение работает, если у вас нет
AutomaticMigrationsEnabled = false;
в вашей конфигурации.Если вы работаете с системой контроля версий (git, svn и т. Д.) И некоторые другие разработчики обновляют объекты db на этапе разработки, то эта ошибка возникает всякий раз, когда вы обновляете базу кода и запускаете приложение.
Как указано выше, есть несколько решений для этого на основе кода. Однако это наиболее практичный вариант для некоторых случаев.
источник
Я также читаю книгу Pro ASP.NET MVC 4 и столкнулся с той же проблемой, что и вы. У меня возникла проблема после внесения изменений, предписанных в разделе «Добавление проверки модели» книги. Я решил проблему, переместив свою базу данных с локальной базы данных на полноценный сервер SQL Server 2012. (Кстати, я знаю, что мне повезло, что я мог перейти на полноценную версию, так что не ненавидите меня. ;-))) Должно быть что-то в связи с базой данных, которая вызывает проблему.
источник
Проверьте это следующие шаги
2.
источник
Изменить
Global.asax.cs
, в том числеApplication_Start
событие с:источник
Эта ошибка может указывать на проблему со строкой подключения и на то, соответствует ли имя строки подключения объявлению контекста базы данных.
У меня была эта ошибка, потому что я неправильно назвал локальную базу данных (глупая ошибка), а имя строки подключения в web.config «DefaultConnection» не совпадает с MyDbContext, т.е.
источник
Попробуйте использовать базу данных SetInitializer, которая относится к использованию System.Data.Entity;
В Global.asax
Это будет создавать новую базу данных каждый раз, когда ваша модель будет изменена. Но ваша база данных будет пустой. Чтобы заполнить ее фиктивными данными, вы можете использовать Seeding. Что вы можете реализовать как:
Посев ::
источник
Это странно, но все ответы здесь были для меня бесполезны. У меня работал инициализатор
MigrateDatabaseToLatestVersion
Вот мое решение (я знаю, это может быть намного проще, но это то, как я его использую):
MyDbInitializerForTesting просто наследуется от DropCreateDatabaseAlways, поэтому в некоторых конкретных случаях (тестирование) вся база данных перестраивается. В противном случае он переносится на последнюю версию.
Мой источник: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific
источник
У меня была такая же проблема, когда мы использовали одну базу данных для двух приложений. Настройка
disableDatabaseInitialization="true"
в разделе типа контекста работает для меня.Подробнее см. Https://msdn.microsoft.com/en-us/data/jj556606.aspx.
источник
Создайте пользовательский контекстный инициализатор:
Обратите внимание, что Migrations.Configuration - это класс, генерируемый командной строкой миграции в консоли диспетчера пакетов. Вам может потребоваться изменить внутренний на публичный модификатор класса Migrations.Configuration.
И зарегистрируйте его в своем OmModelCreating:
источник
Здесь я хочу поделиться другим методом, который предотвращает ошибку поддержки модели при изменении контекста:
1) Откройте файл DbContext
2) Добавить пространство имен, используя Microsoft.AspNet.Identity.EntityFramework;
3) public MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (new DropCreateDatabaseAlways ()); }
источник