O modelo de suporte do contexto 'ApplicationDbContext' mudou desde que o banco de dados foi criado

86

Em primeiro lugar, não vi esse erro em nenhum outro lugar e acho que não é uma réplica, então leia primeiro toda a situação.

Tudo estava funcionando bem, então tentei atualizar uma das minhas classes de modelo (a classe App e a atualização agora está comentada), que irei listar abaixo; e boom eu tive esse erro feio.


O modelo que apoia o contexto 'ApplicationDbContext' mudou desde que o banco de dados foi criado. Considere o uso de migrações do Code First para atualizar o banco de dados ( http://go.microsoft.com/fwlink/?LinkId=238269 ). em System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e () em System.Data.Entity.Internal.InternalContext.PerformInitializationAction (Ação de ação) em System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization () em System.Data.Entity. Internal.LazyInternalContext.b__4 (InternalContext c) em System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 action) em System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () em System.Data.Entity.Internal.InternalContext.GetEntitySet entityType) em System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.Include (String path) em System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable1 source, String path) em System.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable 1 source, Expression1 path) em Microsoft.AspNet.Identity. 6.GetUserAggregateAsync(ExpressionFiltro EntityFramework.UserStore 1) em Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager2.FindByNameAsync (String userName) em Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext () --- Fim do rastreamento de pilha do local anterior onde exceção foi lançada --- em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) em ControlPanel.Web.Controllers.Account__trollers.Account__ : \ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs: linha 56

A princípio pensei que poderia ser um problema de migração, então eliminei totalmente o banco de dados, reativei as migrações e adicionei uma migração Init e atualizei o banco de dados usando

update-database -force -verbose

Tudo vai bem sem reclamações, porém sempre que tento entrar no meu site recebo o erro anterior. Fiz a migração umas dez vezes sem conseguir resolver o problema.

Aqui estão minhas classes de domínio (modelos):

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

Aqui estão meus 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
fonte
Tem certeza de que não viu esse problema em outro lugar? Que tal este link? stackoverflow.com/questions/3600175/…
AndreCruz
4
Não, eles não são os mesmos, posso garantir a você ,, Eu tentei a solução fornecida lá sem nenhum resultado ,, o erro deles diz: Ou exclua / atualize manualmente o banco de dados ,, enquanto o meu diz: Considere o uso de migrações do Code First para atualizar o banco de dados
a7madx7

Respostas:

140

Apenas no caso de alguém se deparar com isso que estava fazendo uma primeira implementação de banco de dados como eu.

Fiz uma alteração estendendo a ApplicationUserclasse, adicionando um novo campo à AspNetUserstabela e, em seguida, tive esse erro na inicialização.

Consegui resolver isso excluindo o registro criado na __MigrationHistorytabela (havia apenas um registro lá). Presumo que EF decidiu que precisava atualizar meu banco de dados usando a ferramenta de migração - mas eu mesmo já tinha feito isso manualmente.

Josh
fonte
1
Banco de dados primeiro também e isso corrigiu. O único registro lá foi a criação inicial, que aconteceu primeiro o código, mas eu o modifiquei depois de usar o banco de dados primeiro e mudar a tabela no servidor MS SQL.
SolidSnake4444 de
Trabalhou. Recebi o erro quando adicionei uma visão de andaime. A classe de contexto de dados da visualização eraApplicationDbContext
Vincent Saelzler,
79

Isso funcionou para mim - nenhuma outra alteração necessária.

DELETE FROM [dbo].[__MigrationHistory]
Daniel de Zwaan
fonte
1
Funcionou para mim também. Correção muito estranha. Acho que houve uma migração interrompida na história. Vou tentar excluir todas as migrações e criar uma inicial novamente.
hakan
1
@Dave Voyles você pode executar este SQL diretamente no SSMS
Daniel de Zwaan
1
Funcionou para mim também. Em um banco de dados, esta tabela existia enquanto ela não existia em outro banco de dados
Tejas
1
As respostas acima não podem me ajudar, pois meus códigos estavam funcionando bem até a última atualização do modelo. Sua resposta funcionou. Saúde, cara !!
Sithu
3
Isso NÃO funcionou para mim e me fez precisar excluir o banco de dados, executar novamente as migrações e adicionar novamente os dados. CUIDADO.
adamonstack
35

Este post corrigiu meu problema. É tudo sobre como adicionar a seguinte linha Application_Start()em Global.asax:

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

No entanto, isso causa a recriação do banco de dados para cada edição em seu modelo e você pode perder seus dados.

Amin Saqi
fonte
4
Não quero que meus dados sejam danificados ou perdidos.
Disse Roohullah Allem em
Não é a melhor abordagem, senhor. Solução, mas não confiável
Ahsan Aftab
14

Se você excluir a tabela "[__MigrationHistory]" de seu "banco de dados> Tabelas do sistema", ela funcionará.

Aniket Sharma
fonte
Funciona. Mas depois de excluir a [__MigrationHistory] tabela, basta atualizar o mmodel EDMX também.
DmitryBoyko
12

Foi um erro tão estranho ,, Não foi meu erro no final, foi da Microsoft ,, instalei o Entity framework a versão "pré-lançamento" e foi o responsável por este erro ,, quando atualizei para o estável libere-o desapareceu ,, obrigado a todos, acreditem em mim quando fiz esta pergunta, eu pesquisei por uma semana ou mais por sua solução, então tenho certeza de que esse problema não está em nenhum outro lugar: a versão do entity framework.dll que causou o problema era 6.0.2 se isso ajudar.

a7madx7
fonte
12

Todo mundo está ficando com dor de cabeça com este erro: Certifique-se de que todos os seus projetos tenham uma referência ao mesmo assembly do Entity Framework.

História curta:

Meu modelo e meu aplicativo estavam em montagens diferentes. Esses assemblies faziam referência a uma versão diferente da estrutura Entity. Acho que as duas versões geraram um id diferente para o mesmo modelo. Portanto, quando meu aplicativo foi executado, o id do modelo não correspondeu ao da última migração em __MigrationHistory. Depois de atualizar todas as referências para o último lançamento da EF, o erro nunca mais apareceu.

Hari
fonte
sim, esse foi o meu caso, a maioria dos projetos foi com ef6.1.3, enquanto o projeto de teste recém-criado foi de alguma forma com ef6.0.
ZZZ
7

Passei muitos dias resolvendo esse problema, analisei muitos posts diferentes e tentei muitas opções e finalmente resolvi. Este 2 projetos em minha solução usando migrações de código EF primeiro:

  • Aplicativo de console "DataModel" que usa principalmente como montagem que contém todas as minhas primeiras entidades de código, DbContext, Mirgations e repositório genérico. Incluí neste projeto um arquivo de banco de dados local vazio separado (na pasta DataModel / App_Data) para poder gerar migrações do Console do gerenciador de pacotes.
  • WebApi, que faz referência ao projeto DataModel e usa o arquivo de banco de dados local da pasta WebApi / App_Data, que não está incluída no projeto

Recebi este erro quando solicitou WebApi ...

Meu ambiente:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional com atualização 1
  • todos os meus projetos direcionados para .NET Framework 4.6.1
  • EntityFramework 6.1.3 do NuGet

Coletei aqui todas as observações que você deve prestar atenção e todas as condições / requisitos que devem ser atendidos, para evitar a exceção mencionada:

  1. Você deve usar apenas uma versão do pacote EntityFramework Nuget para todos os projetos em sua solução.
  2. O banco de dados, criado executando sequencialmente todos os scripts de migração, deve ter a mesma estrutura / esquema que o banco de dados de destino e corresponder ao modelo de entidade. As 3 coisas a seguir devem corresponder / refletir / combinar exatamente:
    • Todo o seu script de migração até o último
    • Código atual primeiro estado do modelo de entidade (DbContext, entidades)
    • Banco de dados de destino
  3. O banco de dados destino (arquivo mdf) deve ser atualizado / corresponder até o último script de migração. Verifique se a tabela "__MigrationHistory" em seu banco de dados de destino contém registros para todos os scripts de migração que você possui, isso significa que todos os scripts de migração foram aplicados com êxito a esse banco de dados. Eu recomendo que você use o Visual Studio para a geração de código correto primeiro entidades e contexto que corresponda ao seu banco de dados, Projeto -> Adicionar Novo Item -> Modelo de Dados de Entidade ADO.NET -> Código Primeiro do banco de dados: Claro, como alternativa, se você não tem nenhum banco de dados, pode escrever o modelo manualmente (codificar primeiro as entidades e o contexto) e, em seguida, gerar a migração inicial e o banco de dados.
  4. Nome da string de conexão, por exemplo, MyConnectionString no arquivo de configuração do projeto de inicialização (Web.config / App.config):

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

    deve ser igual ao parâmetro passado no construtor do seu DbContext:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. Antes de usar o Console do gerenciador de pacotes , certifique-se de estar usando o banco de dados correto para atualizar ou gerar migração e o projeto necessário está definido como projeto de inicialização da solução. Para conectar-se ao banco de dados, ele usará a string de conexão desse arquivo .config, que no projeto, que é definido como projeto de inicialização.
  6. E o principal, que corrigiu meu problema: É estranho, mas na minha pasta WebApi / bin DataModel.exe era antigo, não atualizado desde a última compilação. Como as migrações foram incorporadas ao meu assembly DataModel.exe, meu banco de dados WebApi atualizou usando miragens antigas. Fiquei confuso porque, depois de atualizar o banco de dados no WebApi, ele não corresponde ao script de migração mais recente do DataModel. O código a seguir cria automaticamente (se não existir) ou atualiza o banco de dados local de migração mais recente em minha pasta WebApi / App_Data.

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...
    

    Tentei limpar e reconstruir a solução, mas não ajudou, do que removi completamente as pastas bin e obj de WebApi, excluí arquivos de banco de dados de WebApi / App_Data, construí, reiniciei WebApi, fiz uma solicitação a ele, criei o banco de dados correto - inicialização lenta (usando linhas acima), que corresponde à migração mais recente e a exceção não apareceu mais. Então, isso pode resolver o seu problema:

    1. remover manualmente bin, pastas obj de seu projeto de inicialização (que gera / atualiza seu banco de dados)
    2. construir seu projeto de inicialização ou melhor, limpar e reconstruir toda a sua solução.
    3. recrie o banco de dados iniciando o projeto (executará as linhas acima) ou use o comando "update-database" do Console do Gerenciador de Pacotes.
    4. verifique manualmente se o banco de dados gerado e __MirgationHistory correspondem ao script de migração mais recente.
Sergey Kulgan
fonte
3

Isso pode acontecer quando você altera a anotação de dados de uma propriedade do modelo. por exemplo: adicionar [Obrigatório] a uma propriedade causará uma alteração pendente no design do banco de dados.

A solução mais segura é executar no Console do gerenciador de pacotes:

add-migration myMirgrationName

que exibirá as mudanças exatas no método Up (). Portanto, você pode decidir se realmente deseja aplicar essas alterações por meio de:

update-database

Caso contrário, você pode simplesmente excluir a migração mais recente da tabela __MigrationHistory e da pasta Migrations do Solution Explorer.

Mohamed Nagieb
fonte
Esta é definitivamente a melhor resposta que vi aqui. A sugestão de deletar o histórico de migração é uma péssima ideia na minha opinião!
mgrenier,
Obrigado por seu comentário. Eu também não recomendo excluir o histórico de migração, mas, em particular, o ponto de migração anterior não era muito diferente - ou seja, nenhuma modificação de modelo ocorreu pelo OP -, então pensei que um único passo para trás pode ajudar , excluindo apenas os registros da (s) última (s) migração (ões).
Mohamed Nagieb,
3

Basta excluir o histórico de migração em _MigrationHistory em seu banco de dados. Funcionou para mim

k.demas
fonte
2

Eu estava tendo o mesmo problema que a7madx7, mas com versão estável do EF (v6.1.1), e encontrei a resolução postada em:

http://cybarlab.com/context-has-changed-since-the-database-was-created

com variação em: http://patrickdesjardins.com/blog/the-model-backing-the-context-has-changed-since-the-database-was-created-ef4-3

O segundo link inclui menção específica para VB ..... "você pode simplesmente adicionar todos os dados do banco de dados que estão tendo este problema em seu método app_start no arquivo global.asax como este" :

Database.SetInitializer(Of DatabaseContext)(Nothing)

NB: eu tive que substituir "DatabaseContext" pelo nome da minha classe implementando DbContext

Atualizar: Além disso, ao usar a abordagem codefirst para se conectar a tabelas existentes, verifique o banco de dados para ver se EF criou uma tabela "_migrationhistory" para armazenar mapeamentos. Renomeei esta tabela e, em seguida, consegui remover SetInitializer de global.asax.

user3085342
fonte
1

Acabei de resolver um problema semelhante, excluindo todos os arquivos na pasta do site e, em seguida, republicado.

Daniel Björk
fonte
1

remover todas as tabelas de identidade

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser
Majid Joghataey
fonte
1

No menu Ferramentas, clique em Gerenciador de Pacotes NuGet e em Console do Gerenciador de Pacotes (PMC). Insira os seguintes comandos no PMC.

Enable-Migrations Add-Migration Init Update-Database Execute o aplicativo. A solução para o problema é daqui

Sultão
fonte
1

Quando estou desenvolvendo, prefiro usar esta aula prática para configurar Migrações.

Espero que ajude.

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

}
Andre Mesquita
fonte
0

Excluir linhas na tabela [__MigrationHistory] com productVersion mais antigo funcionou para mim. Esta resposta é para aqueles que não desejam excluir a tabela [__MigrationHistory] inteira. Basta excluir as linhas com a versão anterior na coluna ProductVersion. Espero que ajude alguém!

Rajon Tanducar
fonte
0

Abaixo estava o tipo de erro semelhante que encontrei

O modelo que suporta o contexto 'PsnlContext' mudou desde que o banco de dados foi criado. Considere o uso de migrações do Code First para atualizar o banco de dados ( http://go.microsoft.com/fwlink/?LinkId=238269 ).

Eu adicionei a seção abaixo no evento Application Start do Global.asax para resolver o erro

Database.SetInitializer (null);

Isso resolveu o problema

Lati
fonte
0

simplesmente o erro significa que seus modelos estão alterados e não estão sincronizados com o banco de dados, então vá para o console do gerenciador de pacotes, add-migration foo2 isso dará uma dica do que está causando o problema, pode ser você removeu algo ou no meu caso eu removo uma anotação de dados . a partir daí, você pode obter a mudança e, com sorte, revertê-la em seu modelo.

depois disso, exclua foo2.

Yusufm.Salh
fonte
0

Sei que estou muito atrasado, mas quero dar uma contribuição também. Este erro é realmente estranho, porque o navegador não é capaz de entender como as alterações devem ser processadas porque as classes e suas propriedades podem ter sido alteradas, mas não confirmadas no banco de dados.

Então faça uma coisa,

crie uma migração no Console do gerenciador de pacotes (Ferramentas> Gerenciador de pacotes NuGet> Console do gerenciador de pacotes) usando este comando:

add-migration UpdateMigration

onde UpdateMigration é o nome de sua migração. Você pode dar a ele qualquer nome de sua escolha, mas por favor seja específico.

Depois disso, precisamos apenas atualizar o banco de dados, então execute:

atualizar o banco de dados

Agora que você comprometeu suas alterações no banco de dados, apenas atualize seu navegador e pronto!

Espero que isto ajude.

noobprogrammer
fonte
0

isso ocorre porque você adiciona alguma propriedade a um de seu modelo e não o fez update-Database. para resolver isso você tem que removê-lo do modelo ou add-migration anyProperName com essas propriedades e Update-database.

HeshanHH
fonte
0

Este erro me ocorreu quando fiz alterações no meu modelo e não fiz a migração para as alterações para atualizar o banco de dados.

Se você já fez alterações em seu modelo no Code First Migration Schema

Não se esqueça de adicionar migração

add-migration UpdatesToModelProperites 

O comando acima lerá todas as mudanças que você fez no modelo e as escreverá nos métodos Up () e Down ().

Em seguida, basta atualizar seu banco de dados usando o comando abaixo.

update-database

Foi isso que funcionou para mim.

Raheel Khan
fonte
-2

Exclua o banco de dados existente, crie um novo banco de dados com o mesmo nome, copie todos os dados ... vai funcionar

falso
fonte