Модель, поддерживающая контекст "ApplicationDbContext", изменилась с момента создания базы данных
Прежде всего, я не видел эту ошибку где-либо еще, и я думаю, что это не копия, поэтому, пожалуйста, сначала прочитайте всю ситуацию.
Все работало нормально, тогда я попытался обновить один из моих классов моделей (класс App и обновление теперь оставлено в комментариях), который я буду перечислять ниже, и что у меня возникла эта уродливая ошибка.
Модель, поддерживающая контекст ApplicationDbContext, изменилась с момента создания базы данных. Рекомендуется использовать Code First Migrations для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269). в System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf
1.b__e() в System.Data.Entity.Internal.InternalContext.PerformInitializationAction Action ( в System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() в System.Data.Entity.Internal.LazyInternalContext.b__4 (InternalContext c) в System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action
1) в System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() в System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForTpepe(Type). 1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet
1.Include (путь строки) в System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable
1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable
1 источник, путь строки) в System.Data.Entity.QueryableExtensions.Include [T, TProperty] (1 source, Expression
IQueryable 1 source, Expression
путь 1 source, Expression
1) в Microsoft.AspNet.Identity.EntityFramework.UserStore 6.GetUserAggregateAsync(Expression
фильтр 6.GetUserAggregateAsync(Expression
1) в Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager
2.FindByNameAsync (строка userName) в Microsoft.AspNet.Identity.UserManager'2.d__12.MoveNext( Конец трассировки стека от предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task TaskControl.A..d__2.MoveNext() в d:\Projects\FULL\Панель управления \ControlPanel.Web\Controllers\AccountController.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");
}
}
Ответы
Ответ 1
Это была такая странная ошибка. Это была не моя ошибка в конце, это был Microsoft, я установил фреймворк Entity в версию "до релиза", и он отвечал за эту ошибку, когда я обновил к стабильному выпуску он исчез, спасибо всем, кто мне верит, когда я задал этот вопрос, который я искал, например, неделю или около того для его решения, поэтому я уверен, что эта проблема не где-то еще: версия entity framework.dll что вызвало проблему 6.0.2, если это помогает.
Ответ 2
На всякий случай кто-то натыкается на это, что делает первую реализацию базы данных, как я.
Я внес изменения, расширив класс ApplicationUser
, добавив новое поле в таблицу AspNetUsers
, а затем эту ошибку при запуске.
Мне удалось решить эту проблему, удалив запись, созданную в таблице __MigrationHistory
(там была только одна запись). Я полагаю, что EF решил, что мне нужно обновить мою базу данных с помощью инструмента миграции, но я уже сделал это вручную.
Ответ 3
Это сработало для меня - никаких других изменений не требовалось.
DELETE FROM [dbo].[__MigrationHistory]
Ответ 4
Этот post исправил мою проблему. Все о добавлении следующей строки в Application_Start()
в Global.asax
:
Database.SetInitializer<Models.YourDbContext>(null);
Однако это вызывает восстановление базы данных для каждого редактирования в вашей модели, и вы можете потерять свои данные.
Ответ 5
Каждый получает головную боль от этой ошибки: Убедитесь, что все ваши projetcs имеют ссылку на ту же сборку Entity Framework.
Краткая история:
Моя модель и мое приложение были в разных сборках. Эти сборки ссылались на другую версию инфраструктуры Entity. Я предполагаю, что две версии сгенерировали другой идентификатор для одного и того же модуля. Поэтому, когда мое приложение запускало идентификатор модели, оно не соответствовало одной из последних миграций в __MigrationHistory. После обновления всех ссылок на последнюю версию EF ошибка никогда не появлялась снова.
Ответ 6
Если вы удалите таблицу "[__MigrationHistory]" из своей "базы данных> Системные таблицы", она будет работать.
Ответ 7
Я потратил много дней, чтобы решить эту проблему, проанализировал множество разных сообщений и попробовал множество опций и окончательно зафиксировал .
Это 2 проекта в моем решении с использованием первых миграций EF-кода:
- Консольное приложение "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 вещи должны точно соответствовать/отражать/соответствовать друг другу:
- Вся ваша миграция script до последнего
- Текущее состояние первой модели сущности (DbContext, entity)
- Целевая база данных
- Целевая база данных (файл mdf) должна обновляться/соответствовать последней миграции script. Убедитесь, что таблица "__MigrationHistory" в вашей целевой базе данных содержит записи для всех сценариев миграции, которые вы имеете, это означает, что все сценарии миграции были успешно применены к этой базе данных. Я рекомендую вам использовать Visual Studio для генерации правильных кодов первых сущностей и контекста, соответствующих вашей базе данных, Project → Добавить новый элемент → ADO.NET Entity Data Model → Code First из базы данных:
Конечно, в качестве альтернативы, если у вас нет базы данных, вы можете написать модель вручную (код первых сущностей и контекста), а затем создать начальную миграцию и базу данных.
-
Название строки подключения, например. MyConnectionString в файле конфигурации запуска проекта (Web.config/App.config):
<configuration>
<connectionStrings>
<add name="MyConnectionString" connectionString="...">
</connectionStrings>
<configuration>
должен быть равен параметру, переданному в конструкторе вашего DbContext:
public partial class MyDbContext : DbContext
{
public MyDbContext()
: base("name=MyConnectionString"){}
...
- Перед тем, как использовать Консоль диспетчера пакетов, убедитесь, что вы используете правильную базу данных для обновления или создания миграции, а необходимый проект задается как запускающий проект решения.. Для подключения к в базе данных он будет использовать строку подключения из этого файла .config, который в проекте, который задан как проект запуска.
-
И основной вопрос, который исправил мою проблему: Это странно, но в моей папке WebApi/bin DataModel.exe был стар, не обновлялся с момента последней сборки. Так как миграции были встроены в мою сборку DataModel.exe, то моя обновленная база данных WebApi использовала старые зеркала. Я был смущен, почему после обновления базы данных в WebApi он не соответствует последней миграции script из 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 папки из вашего проекта запуска (который генерирует/обновляет вашу базу данных)
- создайте свой проект запуска или лучше очистите и перестройте все ваши решения.
- воссоздайте базу данных, запустив проект (выполнив строки выше) или воспользуйтесь командой "Обновление-база данных" диспетчера пакетов.
- вручную проверьте, соответствует ли сгенерированная db и __MirgationHistory последней миграции script.
Ответ 8
У меня была такая же проблема, как и 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
Вторая ссылка включает в себя конкретное упоминание для VB..... "вы можете просто добавить все databasecontext, которые имеют эту проблему в вашем методе app_start в файле global.asax, подобном этому":
Database.SetInitializer(Of DatabaseContext)(Nothing)
NB: мне пришлось заменить "DatabaseContext" на имя моего класса, реализующего DbContext
Обновление. Кроме того, при использовании подхода codefirst для подключения к существующим таблицам проверьте базу данных, чтобы увидеть, создала ли EF таблицу "_migrationhistory" для хранения сопоставлений. Я переименовал эту таблицу, после чего смог удалить SetInitializer из global.asax.
Ответ 9
Это может произойти при изменении аннотации данных свойства модели. например: добавление [Обязательный] к свойству вызовет ожидающие изменения в дизайне базы данных.
Самое безопасное решение - запустить на консоли диспетчера пакетов:
add-migration myMirgrationName
который будет отображать точные изменения в методе Up(). Поэтому вы можете решить, действительно ли вы хотите применить такие изменения, с помощью:
update-database
В противном случае вы можете просто удалить последнюю миграцию из таблицы __MigrationHistory и из папки "Миграции" в обозревателе решений.
Ответ 10
Я просто решил аналогичную проблему, удалив все файлы в папке веб-сайта, а затем переиздал ее.
Ответ 11
удалить все идентификаторы таблиц
Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser
Ответ 12
В меню Сервис выберите Диспетчер пакетов NuGet, затем щелкните Консоль диспетчера пакетов (PMC). Введите следующие команды в PMC.
Enable-Migrations Add-Migration Init Update-Database Запустите приложение. Решение проблемы отсюда
Ответ 13
Удаление строк в таблице [__MigrationHistory] с помощью Старшей версии продукта работало для меня. Этот ответ предназначен для тех, кто не хочет удалять всю таблицу [__MigrationHistory]. Просто удалите строки со старой версией в колонке ProductVersion. Надеюсь, это поможет кому-то!
Ответ 14
Когда я занимаюсь разработкой, я предпочитаю использовать этот практический класс для настройки миграции.
Надеюсь, поможет.
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; }
}
Ответ 15
Ниже была похожая ошибка, с которой я столкнулся
Модель, поддерживающая контекст PsnlContext, изменилась с момента создания базы данных. Рекомендуется использовать Code First Migrations для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269).
Я добавил нижеприведенный раздел в событие запуска приложения Global.asax, чтобы устранить ошибку
Database.SetInitializer(null);
Это решило проблему
Ответ 16
Просто удалите историю миграции в _MigrationHistory. У меня сработало
Ответ 17
Удалить существующий db, создать новый db с тем же именем, скопировать все данные... он будет работать
Ответ 18
Добавьте строку ниже внутри "Application_Start" в "Global.asax.cs"
Database.SetInitializer<YourDbContext>(new DropCreateDatabaseIfModelChanges<YourDbContext>());