Модель, поддерживающая контекст "ApplicationDbContext", изменилась с момента создания базы данных
прежде всего, я не видел эту ошибку нигде, и я думаю, что это не реплицировать, поэтому, пожалуйста, прочитайте всю ситуацию в первую очередь.
все работало просто отлично, тогда я попытался обновить один из моих классов модели (the приложение класс и обновление теперь осталось прокомментированным ) , который я буду перечислять ниже, и бум у меня была эта уродливая ошибка.
модель, поддерживающая контекст "ApplicationDbContext", имеет изменилась с момента создания базы данных. Рассмотрите возможность использования первой миграции кода для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269). в системе.Данные.Сущность.CreateDatabaseIfNotExists
1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e () в системе.Данные.Сущность.Внутренний.Внутренний контекст.PerformInitializationAction (действие действие) в системе.Данные.Сущность.Внутренний.Внутренний контекст.PerformDatabaseInitialization () в системе.Данные.Сущность.Внутренний.LazyInternalContext.b__4 (InternalContext c) at Система.Данные.Сущность.Внутренний.RetryAction1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 действие) в системе.Данные.Сущность.Внутренний.LazyInternalContext.InitializeDatabase () в системе.Данные.Сущность.Внутренний.Внутренний контекст.GetEntitySetAndBaseTypeForType (тип entityType) в системе.Данные.Сущность.Внутренний.В LINQ.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.Включить (путь к строке) в системе.Данные.Сущность.Инфраструктура.DbQuery1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable1 Источник, путь строки) в системе.Данные.Сущность.QueryableExtensions.Включить[T, TProperty](IQueryable1 source, Expression1 путь) в Microsoft.сеть САШ.Тождественность.EntityFramework.UserStore6.GetUserAggregateAsync(Expression1 фильтр) в Microsoft.сеть САШ.Тождественность.EntityFramework.UserStore6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager2.FindByNameAsync (String userName) в Microsoft.сеть САШ.Тождественность.UserManager`2.д__12.MoveNext () - - - конец трассировки стека из предыдущего места, где было вызвано исключение - - - в системе.Во время выполнения.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) в системе.Во время выполнения.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) at Панель управления.Сеть.Контроллеры.AccountController.d__2.MoveNext () in d:ProjectsFULLControl панельпанель управления.WebControllersAccountController.cs: строка 56
сначала я подумал, что это может быть проблема миграции, поэтому я полностью удалил базу данных, повторно включил миграции и добавил миграцию Init и обновил базу данных с помощью
update-database -force -verbose
все идет хорошо никаких жалоб, однако всякий раз, когда я пытаюсь войти на мой сайт, я получаю предыдущая ошибка. Я сделал миграцию около десяти раз, не будучи в состоянии решить эту проблему.
вот мои доменные классы (модели):
public class App
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual int AppId { get; set; }
//[Required]
public virtual string FacebookId { get; set; }
//[Required]
public virtual string Secret { get; set; }
public virtual List<User> Users { get; set; }
public virtual List<Post> Posts { get; set; }
//public virtual ApplicationUser Admin { get; set; }
}
public class Post
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual int PostId { get; set; }
public virtual string Content { get; set; }
public virtual string Link { get; set; }
public virtual string Image { get; set; }
public virtual bool IsSpecial { get; set; }
//[Required]
public virtual App App { get; set; }
//[Required]
public virtual DateTime? PublishDate { get; set; }
}
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual int UserId { get; set; }
[MaxLength(500)]
public virtual string FacebookId { get; set; }
[MaxLength(500)]
public virtual string Token { get; set; }
//[Required]
public virtual App App { get; set; }
}
вот мои IdentityModels:
public class ApplicationUser : IdentityUser
{
public virtual List<App> Apps { get; set; }
public bool? IsPremium { get; set; }
[DataType(DataType.Date)]
public DateTime? LastPublishDateTime { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("dCon")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>().ToTable("Admins");
modelBuilder.Entity<ApplicationUser>().ToTable("Admins");
modelBuilder.Entity<IdentityUserRole>().ToTable("AdminRoles");
modelBuilder.Entity<IdentityUserLogin>().ToTable("Logins");
modelBuilder.Entity<IdentityUserClaim>().ToTable("Claims");
modelBuilder.Entity<IdentityRole>().ToTable("Roles");
}
}
17 ответов:
на всякий случай, если кто-то еще наткнется на это, что делал первую реализацию базы данных, как я.
я внес изменения, продлив
ApplicationUserкласс, добавление нового поля кAspNetUsersтаблица, а затем была эта ошибка при запуске.я смог решить эту проблему, удалив запись, созданную в
__MigrationHistoryтаблица (там была только одна запись) я предполагаю, что EF решил, что мне нужно обновить мою базу данных с помощью инструмента миграции - но я уже сделал это сам вручную.
это сработало для меня - никаких других изменений не требуется.
DELETE FROM [dbo].[__MigrationHistory]
этой post фиксированная моя проблема. Это все о добавлении следующей строки в
Application_Start()наGlobal.asax:
Database.SetInitializer<Models.YourDbContext>(null);однако это приводит к воссозданию базы данных для каждого редактирования в вашей модели, и вы можете потерять свои данные.
все получают головную боль от этой ошибки:убедитесь, что все ваши проекты имеют ссылку на одну и ту же сборку Entity Framework.
рассказ длинный:
моя модель и мое заявление были в разных сборках. Эти сборки ссылались на другую версию Entity framework. Я предполагаю, что две версии генерировали разные идентификаторы для одной и той же модели. Поэтому, когда мое приложение запустило идентификатор модели, он не соответствовал одному из последняя миграция в __MigrationHistory. После обновления всех ссылок на последний выпуск EF ошибка больше не появлялась.
Это была такая странная ошибка, это была не моя ошибка в конце, это была Microsoft, я установил Entity framework "предрелизную" версию, и она была ответственна за эту ошибку, когда я обновился до стабильного выпуска, он разочаровал, спасибо всем, поверьте мне, когда я задал этот вопрос, я искал, как в течение недели или около того, для его решения, поэтому я уверен, что эта проблема больше нигде : версия entity framework.dll, которая вызвала проблему, была 6.0.2, если это помогает.
Если вы удалите таблицу " [__MigrationHistory] "из своей" базы данных > системных таблиц", то она будет работать.
Я потратил много дней, чтобы решить эту проблему, проанализировал много разных сообщений и попробовал много вариантов и наконец-то исправлена. Это 2 проекта в моем решении с использованием EF code first migrations:
- консольное приложение "DataModel", которое в основном использует в качестве сборки, которая содержит все мои первые сущности кода, DbContext, Mirgations и общий репозиторий. Я включил в этот проект отдельный пустой файл локальной базы данных (в папке DataModel/App_Data), чтобы иметь возможность генерировать миграции из консоли диспетчера пакетов.
- WebApi, который ссылается на проект DataModel и использует локальный файл базы данных из папки WebApi/App_Data, который не включен в проект
я получил эту ошибку при запросе WebApi...
мое окружение:
- Windows 8.1 x64
- Visual Studio 2015 Professional с обновлением 1
- все мои проекты, предназначенные для .NET Framework 4.6.1
- EntityFramework 6.1.3 от NuGet
здесь я собрал все замечания вы должны обратить внимание и все условия / требования, которые должны быть выполнены, чтобы избежать упомянутого исключения:
- вы должны использовать только одну версию пакета EntityFramework Nuget для всех проектов в вашем решении.
- база данных, созданная путем последовательного выполнения всех сценариев миграции, должна иметь ту же структуру/схему, что и целевая база данных, и соответствовать модели сущности. Следующие 3 вещи должны точно соответствовать / отражать / соответствовать друг другу:
- ваш весь сценарий миграции до последнего
- текущий код первого состояния модели сущности (DbContext, entities)
- целевая база данных
- целевая база данных (файл mdf) должна быть обновлена/соответствовать последнему сценарию миграции. Убедитесь в том, что "__MigrationHistory" таблицы в целевой базе данных содержит записи для всех миграционных скриптов, которые у вас есть, это означает, что все скрипты миграции был успешно применен к этой базе данных. Я рекомендую вам использовать Visual Studio для создания правильного кода первых сущностей и контекста, который соответствует вашей базе данных, Project - > Add New Item - > ADO.NET модель данных сущности - > код сначала из базы данных:
Конечно, в качестве альтернативы, если у вас нет базы данных, вы можете написать вручную модель (сначала код объектов и контекста), а затем создать начальную миграцию и базу данных.
имя подключения например, строка MyConnectionString в конфигурационном файле стартового проекта (Web.config / App.конфигурации):
<configuration> <connectionStrings> <add name="MyConnectionString" connectionString="..."> </connectionStrings> <configuration>должно быть равно параметру, переданному в конструкторе вашего DbContext:
public partial class MyDbContext : DbContext { public MyDbContext() : base("name=MyConnectionString"){} ...- перед использованием Консоль Диспетчера Пакетов убедитесь, что вы используете правильную базу данных для обновления или создания миграции и необходимого проекта устанавливается как запуск проекта решения. для подключения к базе данных он будет использовать строку подключения от этого. конфигурационный файл, который в проекте, который установлен как запуск проекта.
и главный, который исправил мою проблему: это странно, но в моей папке WebAPI/bin DataModel.exe был старым, не обновлялся с момента последней сборки. Поскольку миграции были встроены в мою сборку DataModel.ехе тогда мой веб-API обновлены базы данных, используя старые mirgations. Я был смущен, почему после обновления базы данных в WebApi это не соответствует последнему сценарию миграции из DataModel. Следующий код автоматически создает (если не существует) или обновляет последнюю локальную базу данных миграции в моей папке WebApi/App_Data.
public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); ...я попробовал очистить и перестроить решение, но это не помогло, чем я полностью удалил папки bin и obj из WebApi, удаленные файлы базы данных из WebApi / App_Data, построенный, перезапущенный WebApi, сделал запрос к нему, он создал правильную базу данных-ленивая инициализация( используя строки выше), которая соответствует последней миграции и исключение не появилось больше. Итак, это может решить вашу проблему:
- удалите вручную папки bin, obj из вашего стартового проекта (который генерирует / обновляет вашу базу данных)
- создайте свой стартовый проект или лучше очистите и перестройте все свое решение.
- воссоздать базу данных, запустив проект (будет выполняться строки выше) или использовать консоль диспетчера пакетов "update-database" команда.
- вручную проверьте, генерируется ли БД и __MirgationHistory соответствует последнему сценарию миграции.
У меня была та же проблема, что и a7madx7, но со стабильным выпуском EF (v6.1.1), и нашел разрешение, опубликованное в:
http://cybarlab.com/context-has-changed-since-the-database-was-created
С изменением: http://patrickdesjardins.com/blog/the-model-backing-the-context-has-changed-since-the-database-was-created-ef4-3
2-я ссылка включает в себя конкретное упоминание для VB..... "вы можете просто добавить все databasecontext, которые имеют эту проблему на вашем методе app_start в глобальном масштабе.файл asax вот так":
Database.SetInitializer(Of DatabaseContext)(Nothing)NB: мне пришлось заменить "DatabaseContext" на имя моего класса, реализующего DbContext
Update: кроме того, при использовании codefirst подхода для подключения к существующим таблицам, проверьте базу данных, чтобы увидеть, если EF создал таблицу "_migrationhistory" для хранения сопоставлений. Я переименовал эту таблицу, а затем смог удалить SetInitializer из global.асакс.
удалить все таблицы identity
Delete _MigrationHistory Delete AspNetRoles Delete AspNetUserClaims Delete AspNetUserLogins Delete AspNetRoles Delete AspNetUser
в меню Сервис выберите пункт NuGet Package Manger, затем выберите консоль диспетчера пакетов (PMC). Введите следующие команды в PMC.
Включить-Миграций Добавить-Миграция Init обновленная база данных Запустить приложение. решение проблемы находится здесь
удаление строк в таблице [__MigrationHistory] с более старым productVersion работало для меня. Этот ответ предназначен для тех, кто не хочет удалять всю таблицу [__MigrationHistory]. Просто удалите строки с более старой версией в столбце ProductVersion. Надеюсь, это поможет кому-то!
Это может произойти при изменении аннотации данных свойств модели. например: добавление [требуется] для свойства вызовет ожидающие изменения в дизайне базы данных.
самое безопасное решение-запустить на консоли диспетчера пакетов:
add-migration myMirgrationName, который будет отображать точные изменения в методе up (). Поэтому вы можете решить, действительно ли вы хотите применить такие изменения с помощью:
update-databaseв противном случае, вы можете просто удалить последняя миграция из таблицы __MigrationHistory и из папки миграции Обозреватель решений.
когда я разрабатываю, я предпочитаю использовать этот практический класс для настройки миграции.
надеюсь, что это помогает.
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { this.Configuration.LazyLoadingEnabled = false; } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); Database.SetInitializer(new StackOverflowInitializer()); } public class StackOverflowInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext> { public StackOverflowInitializer() { // TODO NOTHING, COMMENT ALL // IF CHANGES, RECREATE Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ApplicationDbContext>()); // CREATE ONLY NOT EXITS //Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<ApplicationDbContext>()); } } public System.Data.Entity.DbSet<stackoverflow.Models.Company> Companies { get; set; } }
ниже была аналогичная ошибка, с которой я столкнулся
модель, поддерживающая контекст "PsnlContext", изменилась с момента создания базы данных. Рассмотрите возможность использования первой миграции кода для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269).
Я добавил следующий раздел в событие запуска приложения глобального.asax для решения ошибки
добавить строку ниже внутри "Application_Start" в " Global.асакс.cs"
Database.SetInitializer<YourDbContext>(new DropCreateDatabaseIfModelChanges<YourDbContext>());

Comments