Модель, що підтримує контекст 'ApplicationDbContext', змінилася з моменту створення бази даних


85

Перш за все, я більше ніде не бачив цієї помилки, і, мабуть, це не копія, тому, будь ласка, спочатку прочитайте всю ситуацію.

Все працювало чудово, тоді я спробував оновити один із своїх класів моделі ( клас App та оновлення тепер залишено коментарями), який я перелічу нижче; і бум у мене була ця потворна помилка.


Модель, що підтримує контекст 'ApplicationDbContext', змінилася з моменту створення бази даних. Розгляньте можливість використання First 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.DatabaseInitialization (SystemDatabaseInitialization (SystemDatabaseInitialization (SystemDatabaseInitialization 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.InternalCype. entityType) у System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.Включіть (Рядковий шлях) у System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable1 джерело, Рядковий шлях) у System.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable 1 source, Expression1 шлях) у Microsoft.AspNet.Identity. Фільтр EntityFramework.UserStore 6.GetUserAggregateAsync(Expression1) у 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.cnt__Control.Control. : \ 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");
    }
}

Ви впевнені, що не бачили цієї проблеми деінде? Що з цим посиланням? stackoverflow.com/questions/3600175 / ...
AndreCruz

4
Ні, вони не однакові, я можу вас запевнити ,, Я спробував запропоноване там рішення взагалі без результатів ,, їх помилка говорить: Або вручну видаліть / оновіть базу даних ,, тоді як моя каже: Подумайте про використання міграцій коду оновити базу даних
a7madx7

Відповіді:


140

Про всяк випадок, коли хтось ще натрапить на це, що робив першу реалізацію бази даних, як я.

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

Мені вдалося вирішити цю проблему, видаливши запис, створений у __MigrationHistoryтаблиці (там був лише один запис). Припускаю, EF вирішив, що мені потрібно оновити базу даних за допомогою інструменту міграції, але я вже зробив це вручну.


1
База даних також спочатку, і це виправило. Єдиним записом було початкове створення, яке спочатку відбулося з кодом, але я змінив його після першого використання бази даних та зміни таблиці на сервері MS SQL.
SolidSnake4444

Працювали. Помилка з’явилася, коли я додав вигляд з перекладом. Клас контексту даних подання бувApplicationDbContext
Вінсент Зальцлер

78

Це спрацювало для мене - ніяких інших змін не потрібно.

DELETE FROM [dbo].[__MigrationHistory]

1
Працював і у мене. Дуже дивне виправлення. Думаю, в історії була порушена міграція. Я спробую видалити всі міграції та створити початкову ще раз.
hakan

1
@Dave Voyles, ти можеш запустити цей SQL безпосередньо в SSMS
Даніель де Цваан

1
В одній базі даних ця таблиця існувала, тоді як в іншій базі даних вона не існує
Тежас,

1
Наведені вище відповіді не можуть мені допомогти, оскільки мої коди працювали нормально до останнього оновлення моделі. Ваша відповідь зробила свою справу. Вітаю людина !!
Сітху

3
Це НЕ працювало для мене, і мені довелося видалити db, повторно запустити міграції та повторно додати дані. ОСТОРОЖНО.
adamonstack

35

Ця публікація виправила мою проблему. Вся справа в додаванні наступного рядка Application_Start()в Global.asax:

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

Однак це спричиняє створення бази даних для кожного редагування у вашій моделі, і ви можете втратити свої дані.


4
Я не хочу, щоб мої дані були пошкоджені або втрачені.
Саїд Рухулла Аллем,

Не найкращий підхід, сер. Рішення, але ненадійне
Ахсан Афтаб

13

Якщо ви видалите таблицю "[__MigrationHistory]" із "бази даних> Системні таблиці", вона буде працювати.


Це працює. Але після видалення [__MigrationHistory] таблиці просто оновіть також EDMX mmodel.
Дмитро Бойко

12

Це була така дивна помилка ,, Це була не моя помилка в кінці, це була помилка Microsoft ,, Я встановив фреймворк Entity "передвипускну" версію, і вона несла відповідальність за цю помилку ,, коли я перейшов на стабільний випустити це зникло ,, дякую всім, повірте мені, коли я задав це запитання, я шукав, як тиждень, близько того, щоб знайти його рішення, тому я впевнений, що цієї проблеми більше немає: версія entity framework.dll, яка спричинила проблема була 6.0.2, якщо це допомагає.


12

У всіх болить голова від цієї помилки: Переконайтесь, що всі ваші проекти мають посилання на ту саму збірку Entity Framework.

Коротка історія:

Моя модель і моя заявка були в різних збірках. Ці збірки посилалися на іншу версію фреймворку Entity. Я припускаю, що дві версії створили різний ідентифікатор для однієї і тієї ж моделі. Отже, коли моя програма працювала, ідентифікатор моделі не збігався з останнім перенесенням в __MigrationHistory. Після оновлення всіх посилань на останній випуск EF помилка більше не з’являлася.


так, це був мій випадок, більшість проектів було з ef6.1.3, тоді як нещодавно створений тестовий проект був якимось чином з ef6.0.
ZZZ

7

Я витратив багато днів, щоб вирішити цю проблему, проаналізував багато різних публікацій, спробував безліч варіантів і нарешті виправив. Це 2 проекти в моєму рішенні з використанням перших міграцій коду EF:

  • Консольне додаток "DataModel", яке в основному використовується як збірка, що містить усі мої перші сутності коду, DbContext, Mirgations та загальне сховище. Я включив до цього проекту окремий порожній файл локальної бази даних (у папці DataModel / App_Data), щоб мати змогу генерувати міграції з консолі Package Manager.
  • 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 для генерації коректних сутностей першого коду та контексту, що відповідає вашій базі даних, Project -> Add New Item -> ADO.NET Entity Data Model -> Code First з бази даних: Звичайно, як альтернатива у вас немає бази даних, ви можете писати модель вручну (кодуйте спочатку сутності та контекст), а потім генеруйте початкову міграцію та базу даних.
  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. Перш ніж використовувати Package Manager Console , переконайтеся, що ви використовуєте правильну базу даних для оновлення або генерації міграції, а необхідний проект встановлено як проект запуску рішення. Для підключення до бази даних він використовуватиме рядок підключення з того файлу .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. відтворити базу даних, запустивши проект (буде виконано рядки вище), або скористайтеся командою Package Manager Console "update-database".
    4. вручну перевірити, чи згенеровані db та __MirgationHistory відповідають останньому сценарію міграції.

3

Це може статися, коли ви змінюєте анотацію даних властивості моделі. наприклад: додавання [Обов’язково] до властивості спричинить очікувані зміни в дизайні бази даних.

Найбезпечнішим рішенням є запуск на консолі Package Manager:

add-migration myMirgrationName

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

update-database

В іншому випадку ви можете просто видалити останню міграцію з таблиці __MigrationHistory, а з папки Migrations - Solution Explorer.


Це, безумовно, найкраща відповідь, яку я бачив тут. На мою думку, пропозиція видалити історію міграції - дуже погана ідея!
mgrenier

Дякуємо за ваш коментар. Я також зазвичай не рекомендую видаляти історію міграції, але в конкретному випадку попередня точка міграції не надто відрізнялася - тобто в ОП не відбулося великих змін модифікації, тому я думав, що може допомогти один крок назад , шляхом видалення лише останніх записів міграції.
Мохамед Нагіб,

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)

Примітка: мені довелося замінити "DatabaseContext" на ім'я мого класу, що реалізує DbContext

Оновлення: Також, використовуючи перший підхід для підключення до існуючих таблиць, перевірте базу даних, чи EF створив таблицю "_migrationhistory" для зберігання відображень. Я перейменував цю таблицю, після чого зміг видалити SetInitializer з global.asax.


2

Просто видаліть історію міграції в _MigrationHistory у своїй базі даних. У мене це спрацювало


1

Я просто вирішив подібну проблему, видаливши всі файли в папці веб-сайту, а потім перевидав її.


1

видалити всі ідентичності таблиць

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser


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] за допомогою Older productVersion спрацювало для мене. Ця відповідь призначена для тих, хто не хоче видаляти всю таблицю [__MigrationHistory]. Просто видаліть рядки зі старою версією у стовпці ProductVersion. Сподіваюся, це допоможе комусь!


0

Нижче була подібна помилка, з якою я зіткнувся

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

Я додав нижченаведений розділ у події запуску програми Global.asax, щоб вирішити помилку

Database.SetInitializer (null);

Це вирішило проблему


0

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

після цього видалити foo2.


0

Я знаю, що запізнився, але і я хочу внести свій внесок. Ця помилка насправді дивна, оскільки браузер не може зрозуміти, як слід відображати зміни, оскільки класи та їх властивості могли змінитися, але не бути переданими в базу даних.

Тож зробіть одне,

створити одну міграцію в Package Manager Console (Інструменти> NuGet Package Manager> Package Manager Console), використовуючи цю команду:

add-migration UpdateMigration

де UpdateMigration - це назва вашої міграції. Ви можете дати йому будь-яке ім’я на ваш вибір, але будь ласка, будьте конкретні.

Після цього нам просто потрібно оновити базу даних, тому запустіть це:

оновлення-база даних

Тепер, коли ви внесли свої зміни в базу даних, просто оновіть браузер і готово!

Сподіваюся, це допомагає.


0

це відбувається тому, що ви додали якесь властивість до однієї зі своїх моделей, а не зробили update-Database. щоб вирішити це, ви повинні видалити його з моделі, або ви повинні add-migration anyProperName з цими властивостями і Update-database.


0

Ця помилка трапилася зі мною, коли я вніс зміни до своєї Моделі та не здійснив міграцію змін для оновлення бази даних.

Якщо ви коли-небудь вносили зміни до своєї моделі в схемі першої міграції коду

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

add-migration UpdatesToModelProperites 

Вищевказана команда прочитає всі зміни, внесені в модель, і запише в методи Up () та Down ().

Потім просто оновіть базу даних за допомогою наведеної нижче команди.

update-database

Це те, що мені вдалося.


-2

Видаліть існуючу базу даних, створіть нову базу даних з такою ж назвою, скопіюйте всі дані ... це буде працювати

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.