Модель, поддерживающая контекст "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>());