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



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



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






модель, поддерживающая контекст "ApplicationDbContext", имеет изменилась с момента создания базы данных. Рассмотрите возможность использования первой миграции кода для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269). в системе.Данные.Сущность.CreateDatabaseIfNotExists1.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");
}
}
804   17  

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

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

  1. вы должны использовать только одну версию пакета EntityFramework Nuget для всех проектов в вашем решении.
  2. база данных, созданная путем последовательного выполнения всех сценариев миграции, должна иметь ту же структуру/схему, что и целевая база данных, и соответствовать модели сущности. Следующие 3 вещи должны точно соответствовать / отражать / соответствовать друг другу:
    • ваш весь сценарий миграции до последнего
    • текущий код первого состояния модели сущности (DbContext, entities)
    • целевая база данных
  3. целевая база данных (файл mdf) должна быть обновлена/соответствовать последнему сценарию миграции. Убедитесь в том, что "__MigrationHistory" таблицы в целевой базе данных содержит записи для всех миграционных скриптов, которые у вас есть, это означает, что все скрипты миграции был успешно применен к этой базе данных. Я рекомендую вам использовать Visual Studio для создания правильного кода первых сущностей и контекста, который соответствует вашей базе данных, Project - > Add New Item - > ADO.NET модель данных сущности - > код сначала из базы данных: Конечно, в качестве альтернативы, если у вас нет базы данных, вы можете написать вручную модель (сначала код объектов и контекста), а затем создать начальную миграцию и базу данных.
  4. имя подключения например, строка MyConnectionString в конфигурационном файле стартового проекта (Web.config / App.конфигурации):

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

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

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

    1. удалите вручную папки bin, obj из вашего стартового проекта (который генерирует / обновляет вашу базу данных)
    2. создайте свой стартовый проект или лучше очистите и перестройте все свое решение.
    3. воссоздать базу данных, запустив проект (будет выполняться строки выше) или использовать консоль диспетчера пакетов "update-database" команда.
    4. вручную проверьте, генерируется ли БД и __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 для решения ошибки

удалить существующую БД, создать новую БД с тем же именем, скопировать все data...it будет работать

добавить строку ниже внутри "Application_Start" в " Global.асакс.cs"

Database.SetInitializer<YourDbContext>(new DropCreateDatabaseIfModelChanges<YourDbContext>());

Comments

    Ничего не найдено.