El modelo que respalda el contexto 'ApplicationDbContext' ha cambiado desde que se creó la base de datos

85

En primer lugar, no he visto este error en ningún otro lugar y supongo que no es una réplica, así que primero lea la situación completa.

Todo estaba funcionando bien, entonces traté de actualizar una de mis clases de modelo (la clase App y la actualización ahora están comentadas) que enumeraré a continuación; y boom tuve este feo error.


El modelo que respalda el contexto 'ApplicationDbContext' ha cambiado desde que se creó la base de datos. Considere usar Code First Migrations para actualizar la base de datos ( http://go.microsoft.com/fwlink/?LinkId=238269 ). en System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e () en System.Data.Entity.Internal.InternalContext.PerformInitializationAction (acción de acción) en System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization () en System.Data.EntityInitialization () en System.Data.Entity.Action Internal.LazyInternalContext.b__4 (InternalContext c) en System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 acción) en System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () en System.Data.Entity.Internal.InternalContext.GetEntitySetFornd entityType) en System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.Incluya (ruta de cadena) en System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable1 fuente, ruta de cadena) en System.Data.Entity.QueryableExtensions.Include [T, TProperty] ( 1 source, Expressionruta IQueryable 1) en Microsoft.AspNet.Identity. EntityFramework.UserStore 6.GetUserAggregateAsync(Expression1 filtro) en Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager2.FindByNameAsync (String userName) en Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext () --- Fin del seguimiento de la pila desde la ubicación anterior donde se lanzó una excepción --- en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tarea de tarea) en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tarea) en ControlPanel.Web.Controllers.AccountController.d : \ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs: línea 56

Al principio pensé que podría ser un problema de migraciones, así que eliminé la base de datos por completo, volví a habilitar las migraciones, agregué una migración de inicio y actualicé la base de datos usando

update-database -force -verbose

Todo va bien sin quejas, sin embargo, cada vez que intento iniciar sesión en mi sitio aparece el error anterior. Hice la migración unas diez veces sin poder resolver el problema.

Aquí están mis clases de dominio (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; }
}

Aquí están mis 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
fuente
¿Está seguro de que no ha visto este problema en otro lugar? ¿Y este enlace? stackoverflow.com/questions/3600175/…
AndreCruz
4
No, no son los mismos, puedo asegurarle, he probado la solución proporcionada allí sin ningún resultado, su error dice: O borre / actualice manualmente la base de datos, mientras que el mío dice: Considere usar Code First Migrations para actualizar la base de datos
a7madx7

Respuestas:

139

En caso de que alguien más se tope con esto que estaba haciendo una primera implementación de base de datos como yo.

Hice un cambio al extender la ApplicationUserclase, agregar un nuevo campo a la AspNetUserstabla y luego tuve este error al iniciar.

Pude resolver esto eliminando el registro creado en la __MigrationHistorytabla (solo había un registro allí) Supongo que EF decidió que necesitaba actualizar mi base de datos utilizando la herramienta de migración, pero ya lo había hecho manualmente.

Josh
fuente
1
Primero la base de datos y esto lo solucionó. El único registro fue la creación inicial que sucedió en el código primero, pero lo modifiqué después de usar la base de datos primero y cambiar la tabla en el servidor MS SQL.
SolidSnake4444
Trabajó. Recibí el error cuando agregué una vista con andamios. La clase de contexto de datos de la vista fueApplicationDbContext
Vincent Saelzler
78

Esto funcionó para mí, no se requieren otros cambios.

DELETE FROM [dbo].[__MigrationHistory]
Daniel de Zwaan
fuente
1
También funcionó para mí. Arreglo muy extraño. Creo que hubo una migración interrumpida en la historia. Intentaré eliminar todas las migraciones y volver a crear una inicial.
hakan
1
@Dave Voyles puede ejecutar este SQL directamente en SSMS
Daniel de Zwaan
1
Trabajado para mí too.In existía una base de datos de esta tabla, mientras que a fuerza existe en otra base de datos
Tejas
1
Las respuestas anteriores no pueden ayudarme ya que mis códigos funcionaban bien hasta la última actualización del modelo. Tu respuesta funcionó. ¡¡Salud Amigo!!
Sithu
3
Esto NO funcionó para mí y me hizo necesitar eliminar la base de datos, volver a ejecutar las migraciones y volver a agregar los datos. TENER CUIDADO.
adamonstack
35

Esta publicación solucionó mi problema. Se trata de agregar la siguiente línea Application_Start()en Global.asax:

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

Sin embargo, causa la recreación de la base de datos para cada edición en su modelo y puede perder sus datos.

Amin Saqi
fuente
4
No quiero que mis datos se dañen o se pierdan.
Dijo Roohullah Allem
No es el mejor enfoque, señor. Solución pero no confiable
Ahsan Aftab
13

Si elimina la tabla "[__MigrationHistory]" de su "base de datos> Tablas del sistema", funcionará.

Aniket Sharma
fuente
Funciona. Pero después de eliminar la [__MigrationHistory] tabla, simplemente actualice EDMX mmodel también.
DmitryBoyko
12

Fue un error tan extraño, no fue mi error al final, fue de Microsoft, instalé el marco de la entidad la versión "pre-lanzamiento" y fue responsable de este error, cuando actualicé a estable lanzarlo desapareció, gracias a todos, créanme cuando hice esta pregunta, busqué durante una semana más o menos su solución, así que estoy bastante seguro de que este problema no está en ningún otro lugar: la versión de entity framework.dll que causó el El problema fue 6.0.2 si ayuda.

a7madx7
fuente
12

Todo el mundo tiene dolor de cabeza por este error: asegúrese de que todos sus proyectos tengan una referencia al mismo ensamblado de Entity Framework.

Cuento largo:

Mi modelo y mi aplicación estaban en diferentes montajes. Estos ensamblados hacían referencia a una versión diferente de Entity framework. Supongo que las dos versiones generaron una identificación diferente para el mismo modelo. Entonces, cuando mi aplicación ejecutó, la identificación del modelo no coincidía con la de la última migración en __MigrationHistory. Después de actualizar todas las referencias a la última versión de EF, el error nunca volvió a aparecer.

Hari
fuente
sí, ese fue mi caso, la mayoría de los proyectos fueron con ef6.1.3, mientras que el proyecto de prueba recién creado fue de alguna manera con ef6.0.
ZZZ
7

Pasé muchos días para resolver este problema, analicé muchas publicaciones diferentes y probé muchas opciones y finalmente lo solucioné. Estos 2 proyectos en mi solución usando el código EF primeras migraciones:

  • Aplicación de consola "DataModel" que se usa principalmente como ensamblaje que contiene todas las entidades de primer código, DbContext, Mirgation y repositorio genérico. He incluido en este proyecto un archivo de base de datos local vacío separado (en la carpeta DataModel / App_Data) para poder generar migraciones desde Package Manager Console.
  • WebApi, que hace referencia al proyecto DataModel y utiliza un archivo de base de datos local de la carpeta WebApi / App_Data, que no se incluye en el proyecto

Recibí este error cuando solicité WebApi ...

Mi entorno:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional con la actualización 1
  • todos mis proyectos dirigidos a .NET Framework 4.6.1
  • EntityFramework 6.1.3 de NuGet

Aquí recopilé todos los comentarios a los que debe prestar atención y todas las condiciones / requisitos que deben cumplirse, para evitar la excepción mencionada:

  1. Debe usar solo una versión del paquete EntityFramework Nuget para todos los proyectos de su solución.
  2. La base de datos, creada mediante la ejecución secuencial de todos los scripts de migración, debe tener la misma estructura / esquema que la base de datos de destino y corresponder al modelo de entidad. Las siguientes 3 cosas deben corresponder / reflejar / coincidir exactamente entre sí:
    • Todo su script de migración hasta el final
    • Estado del primer modelo de entidad del código actual (DbContext, entidades)
    • Base de datos de destino
  3. La base de datos de destino (archivo mdf) debe actualizarse / corresponderse con el último script de migración. Verifique que la tabla "__MigrationHistory" en su base de datos de destino contenga registros de todos los scripts de migración que tiene, significa que todos los scripts de migración se aplicaron correctamente a esa base de datos. Le recomiendo que use Visual Studio para generar el código correcto primero las entidades y el contexto que corresponda a su base de datos, Proyecto -> Agregar nuevo elemento -> Modelo de datos de entidad ADO.NET -> Código primero desde la base de datos: Por supuesto, como alternativa, si no tiene una base de datos, puede escribir el modelo manualmente (codificar primero las entidades y el contexto) y luego generar la migración inicial y la base de datos.
  4. Nombre de la cadena de conexión, por ejemplo, MyConnectionString en el archivo de configuración del proyecto de inicio (Web.config / App.config):

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

    debe ser igual al parámetro pasado en el constructor de su DbContext:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. Antes de usar Package Manager Console , asegúrese de que está usando la base de datos correcta para actualizar o generar la migración y que el proyecto necesario está configurado como proyecto de inicio de la solución. Para conectarse a la base de datos, usará la cadena de conexión de ese archivo .config, que en el proyecto está configurado como proyecto de inicio.
  6. Y el principal, que solucionó mi problema: es extraño, pero en mi carpeta WebApi / bin, DataModel.exe era antiguo, no se actualizó desde la última compilación. Dado que las migraciones estaban incrustadas en mi ensamblaje DataModel.exe, mi base de datos actualizada de WebApi utilizando duplicaciones antiguas. Estaba confundido por qué después de actualizar la base de datos en WebApi no se corresponde con el último script de migración de DataModel. El siguiente código crea automáticamente (si no existe) o actualiza la última base de datos local de migración en mi carpeta WebApi / App_Data.

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

    Intenté limpiar y reconstruir la solución pero no ayudó, entonces eliminé por completo las carpetas bin y obj de WebApi, eliminé los archivos de base de datos de WebApi / App_Data, construí, reinicié WebApi, hice una solicitud, creó la base de datos correcta - inicialización perezosa (usando líneas arriba), que corresponde a la última migración y la excepción no apareció más. Entonces, esto puede solucionar su problema:

    1. elimine manualmente las carpetas bin, obj de su proyecto de inicio (que genera / actualiza su base de datos)
    2. construya su proyecto de inicio o mejor limpie y reconstruya toda su solución.
    3. vuelva a crear la base de datos iniciando el proyecto (ejecutará las líneas anteriores) o use el comando "actualizar-base de datos" de la Consola del Administrador de paquetes.
    4. compruebe manualmente si la base de datos generada y __MirgationHistory corresponden al último script de migración.
Sergey Kulgan
fuente
3

Esto puede suceder cuando cambia la anotación de datos de una propiedad del modelo. por ejemplo: agregar [Obligatorio] a una propiedad provocará un cambio pendiente en el diseño de la base de datos.

La solución más segura es ejecutarla en Package Manager Console:

add-migration myMirgrationName

que mostrará los cambios exactos en el método Up (). Por lo tanto, puede decidir si realmente desea aplicar dichos cambios a través de:

update-database

De lo contrario, puede eliminar la última migración de la tabla __MigrationHistory y de la carpeta Migraciones el Explorador de soluciones.

Mohamed Nagieb
fuente
Esta es definitivamente la mejor respuesta que he visto aquí. ¡La sugerencia de eliminar el historial de migración es una muy mala idea en mi opinión!
mgrenier
Gracias por tu comentario. Por lo general, tampoco recomiendo eliminar el historial de migración, pero en un caso particular, el punto de migración anterior no era demasiado diferente, es decir, el OP no había realizado muchas modificaciones en el modelo, por lo que pensé que un solo paso hacia atrás puede ayudar , eliminando solo los últimos registros de migración.
Mohamed Nagieb
2

Tenía el mismo problema que a7madx7, pero con una versión estable de EF (v6.1.1), y encontré una resolución publicada en:

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

con variación en: http://patrickdesjardins.com/blog/the-model-backing-the-context-has-changed-since-the-database-was-created-ef4-3

El segundo enlace incluye una mención específica para VB ..... "simplemente puede agregar todo el contexto de la base de datos que tiene este problema en su método app_start en el archivo global.asax como este" :

Database.SetInitializer(Of DatabaseContext)(Nothing)

NB: tuve que reemplazar "DatabaseContext" con el nombre de mi clase implementando DbContext

Actualización: Además, al usar el enfoque de codefirst para conectarse a tablas existentes, verifique la base de datos para ver si EF ha creado una tabla "_migrationhistory" para almacenar asignaciones. Cambié el nombre de esta tabla y luego pude eliminar SetInitializer de global.asax.

usuario3085342
fuente
2

Simplemente elimine el historial de migración en _MigrationHistory en su base de datos. Funcionó para mi

k.demas
fuente
1

Acabo de resolver un problema similar eliminando todos los archivos en la carpeta del sitio web y luego lo volví a publicar.

Daniel Björk
fuente
1

eliminar la identidad de todas las tablas

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser
Majid joghataey
fuente
1

En el menú Herramientas, haga clic en Administrador de paquetes NuGet y luego en Consola del administrador de paquetes (PMC). Ingrese los siguientes comandos en el PMC.

Enable-Migrations Add-Migration Init Update-Database Ejecute la aplicación. La solución al problema es de aquí.

Sultán
fuente
1

Cuando estoy desarrollando, prefiero usar esta clase práctica para configurar Migraciones.

Espero eso ayude.

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

}
André Mesquita
fuente
0

Eliminar filas en la tabla [__MigrationHistory] con la versión anterior del producto funcionó para mí. Esta respuesta es para aquellos que no quieren eliminar la tabla [__MigrationHistory] completa. Simplemente elimine las filas con la versión anterior en la columna ProductVersion. ¡Espero que ayude a alguien!

Rajon Tanducar
fuente
0

A continuación se muestra el tipo de error similar que encontré

El modelo que respalda el contexto 'PsnlContext' ha cambiado desde que se creó la base de datos. Considere usar Code First Migrations para actualizar la base de datos ( http://go.microsoft.com/fwlink/?LinkId=238269 ).

Agregué la siguiente sección en el evento Application Start de Global.asax para resolver el error

Database.SetInitializer (nulo);

Esto solucionó el problema

Lati
fuente
0

simplemente el error significa que sus modelos tienen cambios y no están sincronizados con DB, así que vaya a la consola del administrador de paquetes, add-migration foo2 esto le dará una pista de lo que está causando el problema, puede que haya eliminado algo o, en mi caso, elimino una anotación de datos . desde allí puede obtener el cambio y, con suerte, revertirlo en su modelo.

después de eso, elimine foo2.

Yusufm.Salh
fuente
0

Sé que llego muy tarde, pero también quiero contribuir. Este error es realmente extraño, porque el navegador no puede entender cómo se deben representar los cambios porque las clases y sus propiedades pueden haber cambiado pero no se han comprometido con la base de datos.

Así que haz una cosa

cree una migración en la Consola del Administrador de paquetes (Herramientas> Administrador de paquetes NuGet> Consola del Administrador de paquetes) usando este comando:

add-migration UpdateMigration

donde UpdateMigration es el nombre de su migración. Puede darle el nombre que desee, pero sea específico.

Después de eso, solo necesitamos actualizar la base de datos, así que ejecuta esto:

actualizar base de datos

Ahora que ha confirmado sus cambios en la base de datos, simplemente actualice su navegador y listo.

Espero que esto ayude.

noobprogrammer
fuente
0

esto se debe a que agregaste alguna propiedad a uno de tus modelos y no lo hiciste update-Database. para solucionar esto tienes que quitarlo del modelo o tienes que hacerlo add-migration anyProperName con esas propiedades y Update-database.

HeshanHH
fuente
0

Se me ocurrió este error cuando hice cambios en mi modelo y no realicé la migración para que los cambios actualizaran la base de datos.

Si alguna vez ha realizado cambios en su modelo en Code First Migration Schema

No olvide agregar la migración

add-migration UpdatesToModelProperites 

El comando anterior leerá todos los cambios que ha realizado en el modelo y los escribirá en los métodos Up () y Down ().

Luego, simplemente actualice su base de datos usando el siguiente comando.

update-database

Esto es lo que funcionó para mí.

Raheel Khan
fuente
-2

Elimine la base de datos existente, cree una nueva base de datos con el mismo nombre, copie todos los datos ... funcionará

falso
fuente