.net - initial - базовая модель контекста изменилась с момента создания базы данных




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

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

Все отлично работало, и я попытался обновить один из моих классов моделей (теперь класс 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__DisplayClassf 1.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(Action 1 действие) в System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () в System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType (тип entityType) в System.Data .Entity.Internal.Linq.InternalSet 1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet 1.Include (String path) в 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 источник, путь String) в 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 (имя_терминала) в Microsoft.AspNet.Identity.UserManager`2.d_ 12.MoveNext () - - Конец трассировки стека из предыдущего места, где было выбрано исключение - в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача задачи) в ControlPanel.Web.Controllers. AccountController.d _2.MoveNext () в d: \ 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");
    }
}

https://code.i-harness.com


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

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


Все получают головную боль от этой ошибки: убедитесь, что все ваши projetcs ссылаются на одну и ту же сборку Entity Framework.

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

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


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

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

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


У меня была такая же проблема, как и у a7madx7, но со стабильным выпуском EF (v6.1.1) и найдено разрешение, опубликованное в:

post

с изменением: 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.


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


Удалите таблицу «[__MigrationHistory]» из ваших «системных таблиц базы данных». Это будет работать нормально.


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

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

add-migration myMirgrationName

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

update-database

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


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

DELETE FROM [dbo].[__MigrationHistory]

Я провел много дней, чтобы решить эту проблему, проанализировал много разных сообщений и попробовал много вариантов и, наконец, исправил. Это 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, entity)
    • Целевая база данных
  3. Целевая база данных (файл mdf) должна обновляться / соответствовать последнему сценарию миграции. Убедитесь, что таблица «__MigrationHistory» в вашей целевой базе данных содержит записи для всех сценариев миграции, которые вы имеете, это означает, что все сценарии миграции были успешно применены к этой базе данных. Я рекомендую вам использовать Visual Studio для генерации правильных кодов первых сущностей и контекста, соответствующих вашей базе данных, Project -> Добавить новый элемент -> 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. Прежде чем использовать консоль диспетчера пакетов , убедитесь, что вы используете правильную базу данных для обновления или создания миграции, а необходимый проект задается как проект запуска. Для подключения к базе данных он будет использовать строку подключения из этого файла .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. воссоздайте базу данных, запустив проект (выполнив строки выше) или воспользуйтесь командой «Обновление-база данных» диспетчера пакетов.
    4. вручную проверьте, соответствует ли сгенерированный db и __MirgationHistory последнему сценарию миграции.

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







asp.net-mvc-5