Модель, поддерживающая контекст ApplicationDbContext, изменилась с момента создания базы данных.

85

Прежде всего, я больше нигде не встречал эту ошибку и полагаю, что это не копия, поэтому сначала прочтите всю ситуацию.

Все работало нормально, тогда я попытался обновить один из моих классов модели ( класс 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__DisplayClassf1.b__e () в System.Data.Entity.Internal.InternalContext.PerformInitializationAction (действие действия) в 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(Action1 действие) в System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () в System.Data.Entity.Internal.InternalContext.GetEntitySetAndBasey entityType) в System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1. Включить (строковый путь) в 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryableисточник System.Data.Entity.Infrastructure.DbQuery 1, строковый путь) в System.Data.Entity.QueryableExtensions.Include [T, TProperty] ( 1 source, Expressionпуть IQueryable 1) в Microsoft.AspNet.Identity. EntityFramework.UserStore 6.GetUserAggregateAsync(Expression1 filter) в Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager2.FindByNameAsync (String userName) в Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext () --- Конец трассировки стека из предыдущего местоположения, где исключение было создано --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в ControlPanel.Web.Controllers..dAccountController : \ Projects \ FULL \ Control Panel \ 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");
    }
}
a7madx7
источник
Вы уверены, что не видели эту проблему где-либо еще? Что насчет этой ссылки? stackoverflow.com/questions/3600175/…
AndreCruz
4
Нет, они не такие, я могу вас заверить, я пробовал решение, предоставленное там, без каких-либо результатов, их ошибка говорит: Либо вручную удалите / обновите базу данных, тогда как моя говорит: подумайте об использовании Code First Migrations для обновления базы
a7madx7

Ответы:

139

На всякий случай, если кто-то еще наткнется на это, он делал первую реализацию базы данных, как я.

Я внес изменения, расширив ApplicationUserкласс, добавив новое поле в AspNetUsersтаблицу, а затем при запуске возникла эта ошибка.

Я смог решить эту проблему, удалив запись, созданную в __MigrationHistoryтаблице (там была только одна запись). Я предполагаю, что EF решил, что мне нужно обновить свою базу данных с помощью инструмента миграции, но я сам уже сделал это вручную.

Джош
источник
1
Сначала база данных, и это исправило ее. Единственной записью было первоначальное создание, которое сначала произошло в коде, но я изменил его после использования базы данных и изменения таблицы на сервере MS SQL.
SolidSnake4444
Работал. Я получил сообщение об ошибке, когда добавил представление с шаблоном. Класс контекста данных представления былApplicationDbContext
Винсент Сэлцлер,
78

У меня это сработало - никаких других изменений не потребовалось.

DELETE FROM [dbo].[__MigrationHistory]
Даниэль де Цваан
источник
1
У меня тоже сработало. Очень странное исправление. Думаю, в истории была прерванная миграция. Я постараюсь удалить все миграции и снова создать начальную.
hakan
1
@Dave Voyles, вы можете запустить этот SQL прямо в SSMS
Даниэль де Цваан
1
У меня тоже сработало. В одной базе данных эта таблица существовала, тогда как в другой базе данных она не существует
Tejas
1
Приведенные выше ответы не могут мне помочь, так как мои коды работали нормально до последнего обновления модели. Ваш ответ сработал. Ура, мужик !!
Ситу
3
Это НЕ сработало для меня, и мне пришлось удалить базу данных, повторно запустить миграции и повторно добавить данные. ОСТОРОЖНО.
adamonstack
35

Этот пост исправил мою проблему. Все дело в добавлении следующей строки Application_Start()в Global.asax:

Database.SetInitializer<Models.YourDbContext>(null);

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

Амин Саки
источник
4
Я не хочу, чтобы мои данные были повреждены или потеряны.
Сказал Рухулла Аллем
Не лучший подход, сэр. Решение, но ненадежное
Ахсан Афтаб
13

Если вы удалите таблицу «[__MigrationHistory]» из «База данных> Системные таблицы», она заработает.

Аникет Шарма
источник
Оно работает. Но после удаления [__MigrationHistory] таблицы просто обновите также mmodel EDMX.
DmitryBoyko
12

Это была такая странная ошибка, это была не моя ошибка в конце, это была ошибка Microsoft, я установил Entity framework в «предварительной» версии, и она была ответственна за эту ошибку, когда я обновился до стабильной отпустите его, спасибо, все поверили мне, когда я задал этот вопрос, я искал примерно неделю для его решения, поэтому я почти уверен, что этой проблемы нет больше нигде: версия entity framework.dll, которая вызвала проблема была 6.0.2 если поможет.

a7madx7
источник
12

Эта ошибка вызывает у всех головную боль: убедитесь, что все ваши проекты имеют ссылку на одну и ту же сборку Entity Framework.

Короткий рассказ длинный:

Моя модель и мое приложение были в разных сборках. Эти сборки ссылались на другую версию Entity framework. Я предполагаю, что две версии создали разные идентификаторы для одной и той же модели. Поэтому, когда мое приложение запускало идентификатор модели, не совпадал с идентификатором последней миграции в __MigrationHistory. После обновления всех ссылок на последний выпуск EF ошибка больше не появлялась.

Хари
источник
да, это был мой случай, большинство проектов было с ef6.1.3, в то время как недавно созданный тестовый проект каким-то образом был с ef6.0.
ZZZ
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

Здесь я собрал все замечания, на которые следует обратить внимание, и все условия / требования, которые должны быть выполнены, чтобы избежать упомянутого исключения:

  1. Вы должны использовать только одну версию пакета EntityFramework Nuget для всех проектов в вашем решении.
  2. База данных, созданная путем последовательного выполнения всех сценариев миграции, должна иметь ту же структуру / схему, что и ваша целевая база данных, и соответствовать модели сущностей. Следующие 3 вещи должны точно соответствовать / отражать / соответствовать друг другу:
    • Весь ваш скрипт миграции до последнего
    • Текущее состояние модели первой сущности текущего кода (DbContext, сущности)
    • Целевая база данных
  3. Целевая база данных (файл mdf) должна быть обновлена ​​/ соответствовать последнему скрипту миграции. Убедитесь, что таблица «__MigrationHistory» в целевой базе данных содержит записи для всех сценариев миграции, которые у вас есть. Это означает, что все сценарии миграции были успешно применены к этой базе данных. Я рекомендую вам использовать Visual Studio для создания правильных первых сущностей кода и контекста, который соответствует вашей базе данных, Проект -> Добавить новый элемент -> Модель данных сущностей ADO.NET -> Сначала код из базы данных: Конечно, в качестве альтернативы, если у вас нет базы данных, которую вы можете написать вручную, модель (сначала кодировать сущности и контекст), а затем сгенерировать начальную миграцию и базу данных.
  4. Имя строки подключения, например MyConnectionString в файле конфигурации запускаемого проекта (Web.config / App.config):

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>
    

    должен быть равен параметру, переданному в конструкторе вашего DbContext:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. Перед использованием консоли диспетчера пакетов убедитесь, что вы используете правильную базу данных для обновления или генерации миграции, а необходимый проект установлен как запускаемый проект решения. Для подключения к базе данных он будет использовать строку подключения из этого файла .config, который в проекте установлен как запускаемый проект.
  6. И главное, что устранило мою проблему: это странно, но в моей папке WebApi / bin DataModel.exe был старым, не обновлялся с момента последней сборки. Поскольку миграции были встроены в мою сборку DataModel.exe, моя база данных WebApi обновлялась с использованием старых зеркал. Меня смутило, почему после обновления базы данных в 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, сделал запрос к нему, он создал правильную базу данных - ленивая инициализация (с использованием строки выше), что соответствует последней миграции, и исключение больше не появлялось. Итак, это может решить вашу проблему:

    1. удалить вручную папки bin, obj из вашего запускаемого проекта (который генерирует / обновляет вашу базу данных)
    2. создайте свой запускаемый проект или, лучше, очистите и перестройте все свое решение.
    3. воссоздайте базу данных, запустив проект (будут выполнены строки выше) или используйте команду «update-database» консоли диспетчера пакетов.
    4. вручную проверьте, соответствуют ли созданные db и __MirgationHistory последнему сценарию миграции.
Сергей Калган
источник
3

Это может произойти, когда вы изменяете аннотацию к данным свойства модели. например: добавление [Обязательно] к свойству вызовет отложенное изменение в структуре базы данных.

Самым безопасным решением является запуск в консоли диспетчера пакетов:

add-migration myMirgrationName

который отобразит точные изменения в методе Up (). Таким образом, вы можете решить, действительно ли вы хотите применить такие изменения, с помощью:

update-database

В противном случае вы можете просто удалить последнюю миграцию из таблицы __MigrationHistory и из папки Migrations в обозревателе решений.

Мохамед Нагиеб
источник
Это определенно лучший ответ, который я здесь видел. На мой взгляд, предложение удалить историю миграции - очень плохая идея!
mgrenier
Спасибо за ваш комментарий. Я также обычно не рекомендую удалять историю миграции, но в конкретном случае предыдущая точка миграции не слишком отличалась - т.е. OP не производил особых изменений модели - поэтому я подумал, что может помочь один шаг назад , удалив только самые последние записи миграции.
Mohamed Nagieb
2

У меня была та же проблема, что и у 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 ..... "вы можете просто добавить весь контекст базы данных, у которого есть эта проблема, в свой метод app_start в файле global.asax следующим образом" :

Database.SetInitializer(Of DatabaseContext)(Nothing)

NB: мне пришлось заменить "DatabaseContext" на имя моего класса, реализующего DbContext

Обновление. Кроме того, при использовании подхода «сначала код» для подключения к существующим таблицам проверьте базу данных, чтобы узнать, создал ли EF таблицу «_migrationhistory» для хранения сопоставлений. Я переименовал эту таблицу, после чего смог удалить SetInitializer из global.asax.

user3085342
источник
2

Просто удалите историю миграции в _MigrationHistory в своей базе данных. Это сработало для меня

к. отеки
источник
1

Я просто решил аналогичную проблему, удалив все файлы в папке веб-сайта, а затем повторно опубликовав ее.

Даниэль Бьорк
источник
1

удалить все идентификаторы таблиц

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser
Маджид джогхатэй
источник
1

В меню «Сервис» выберите «Диспетчер пакетов NuGet», а затем - «Консоль диспетчера пакетов (PMC)». Введите следующие команды в PMC.

Enable-Migrations Add-Migration Init Update-Database Запустите приложение. Решение проблемы отсюда

Султан
источник
1

Когда я разрабатываю, я предпочитаю использовать этот практический класс для настройки миграции.

Надеюсь, это поможет.

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; }

}
Андре Мескита
источник
0

У меня сработало удаление строк в таблице [__MigrationHistory] с помощью более старой версии продукта. Это ответ для тех, кто не хочет удалять всю таблицу [__MigrationHistory]. Просто удалите строки со старой версией в столбце ProductVersion. Надеюсь, это кому-то поможет!

Раджон Тандукар
источник
0

Ниже была подобная ошибка, с которой я столкнулся

Модель, поддерживающая контекст «PsnlContext», изменилась с момента создания базы данных. Рассмотрите возможность использования Code First Migrations для обновления базы данных ( http://go.microsoft.com/fwlink/?LinkId=238269 ).

Я добавил следующий раздел в событие запуска приложения Global.asax, чтобы устранить ошибку.

Database.SetInitializer (ноль);

Это устранило проблему

Лати
источник
0

просто ошибка означает, что ваша модель имеет изменения и не синхронизирована с БД, поэтому перейдите в консоль диспетчера пакетов, add-migration foo2 это даст намек на то, что вызывает проблему, может быть, вы что-то удалили или в моем случае я удаляю аннотацию данных . оттуда вы можете получить изменение и, надеюсь, отменить его в своей модели.

после этого удалите foo2.

Юсуфм. Салх
источник
0

Я знаю, что очень опаздываю, но я тоже хочу внести свой вклад. Эта ошибка действительно странная, потому что браузер не может понять, как следует отображать изменения, потому что классы и их свойства могли измениться, но не зафиксированы в базе данных.

Так что сделай одно,

создайте одну миграцию в консоли диспетчера пакетов (Инструменты> Диспетчер пакетов NuGet> Консоль диспетчера пакетов) с помощью этой команды:

надстройка миграции UpdateMigration

где UpdateMigration - это имя вашей миграции. Вы можете дать ему любое имя по вашему выбору, но, пожалуйста, будьте конкретны.

После этого нам просто нужно обновить базу данных, поэтому запустите это:

обновление базы данных

Теперь, когда вы зафиксировали изменения в базе данных, просто обновите страницу в браузере и готово!

Надеюсь это поможет.

нубпрограммист
источник
0

это происходит потому, что вы добавляете какое-то свойство к одной из своих моделей, а вы этого не делали update-Database. чтобы решить эту проблему, вам нужно удалить его из модели или вы должны использовать add-migration anyProperName эти свойства и Update-database.

HeshanHH
источник
0

Эта ошибка возникла у меня, когда я внес изменения в свою модель и не выполнил миграцию изменений для обновления базы данных.

Если вы когда-либо вносили изменения в свою модель в схеме Code First Migration Schema

Не забудьте добавить миграцию

add-migration UpdatesToModelProperites 

Вышеупомянутая команда прочитает все изменения, которые вы сделали в модели, и запишет их в методы Up () и Down ().

Затем просто обновите свою базу данных, используя команду ниже.

update-database

Это то, что сработало для меня.

Рахил Хан
источник
-2

Удалите существующий db, создайте новый db с тем же именем, скопируйте все данные ... он будет работать

искусственный
источник