EF5 Obteniendo este mensaje de error: No se puede comprobar la compatibilidad del modelo porque la base de datos no contiene metadatos del modelo


Tengo este mensaje de error que sigue mostrándose cada vez que corro la aplicación. Estoy usando Entity Framework 5: Code First

Aquí está el mensaje de error,

System.NotSupportedException: Model compatibility cannot be checked because the database does not contain model metadata. Model compatibility can only be checked for databases created using Code First or Code First Migrations.
   at System.Data.Entity.Internal.ModelCompatibilityChecker.CompatibleWithModel(InternalContext internalContext, ModelHashCalculator modelHashCalculator, Boolean throwIfNoMetadata)
   at System.Data.Entity.Internal.InternalContext.CompatibleWithModel(Boolean throwIfNoMetadata)
   at System.Data.Entity.Database.CompatibleWithModel(Boolean throwIfNoMetadata)
   at System.Data.Entity.DropCreateDatabaseIfModelChanges`1.InitializeDatabase(TContext context)
   at System.Data.Entity.Database.<>c__DisplayClass2`1.<SetInitializerInternal>b__0(DbContext c)
   at System.Data.Entity.Internal.InternalContext.<>c__DisplayClass8.<PerformDatabaseInitialization>b__6()
   at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
   at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
   at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
   at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
   at System.Data.Entity.Internal.InternalContext.Initialize()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
   at System.Data.Entity.DbSet`1.Add(TEntity entity)
   at LaundryService_DEMO.frmMain.btnCreate_Click(Object sender, EventArgs e) in d:\MyDocs\Visual Studio 2012\Projects\LaundryService_DEMO\LaundryService_DEMO\frmMain.cs:line 39

Este error comenzó cuando creé una entidad llamada factura. Aquí está el código completo de la entidad,

public class Invoice
{
    public string InvoiceID { get; set; }
    public string CustomerID { get; set; }
    public string UserID { get; set; }
    public decimal TotalAmount { get; set; }
    public DateTime TransactionDate { get; set; }
    public DateTime PaymentDate { get; set; }

    public Customer CustomerField { get; set; }
    public SystemUser SystemUserField { get; set; }
}

public class InvoiceMap : EntityTypeConfiguration<Invoice>
{
    public InvoiceMap()
    {
        // Primary Key
        this.HasKey(x => x.InvoiceID);

        // Property(ies) and Mapping(s)
        this.ToTable("Invoice");

        this.Property(x => x.InvoiceID)
            .IsRequired()
            .HasMaxLength(15)
            .HasColumnName("InvoiceID")
            .HasColumnType("nVarchar");

        this.Property(x => x.CustomerID)
            .IsRequired()
            .HasMaxLength(15)
            .HasColumnName("CustomerID")
            .HasColumnType("nVarchar");

        this.Property(x => x.UserID)
            .IsRequired()
            .HasMaxLength(15)
            .HasColumnName("UserID")
            .HasColumnType("nVarchar");

        this.Property(x => x.TotalAmount)
            .IsRequired()
            .HasColumnName("TotalAmount")
            .HasColumnType("decimal");

        this.Property(x => x.TransactionDate)
            .IsRequired()
            .HasColumnName("TransactionDate")
            .HasColumnType("datetime");

        this.Property(x => x.PaymentDate)
            .IsOptional()
            .HasColumnName("PaymentDate")
            .HasColumnType("datetime");

        // Relationship
        this.HasRequired(x => x.CustomerField)
            .WithMany(x => x.InvoiceCollection)
            .HasForeignKey(y => y.CustomerID);

        this.HasRequired(x => x.SystemUserField)
            .WithMany(x => x.InvoiceCollection)
            .HasForeignKey(y => y.UserID);
    }
}

Para replicar la aplicación, he incluido el archivo de proyecto que está disponible para descargar. Y así esta pregunta no estará llena de código.

Si hay detalles que me he perdido en la pregunta, por favor comente para que pueda incluirla.

Author: Community, 2012-12-28

8 answers

Encontré que el código funcionaba cambiando

static LaundryShopContext()
{
  Database.SetInitializer<LaundryShopContext>(
    new DropCreateDatabaseIfModelChanges<LaundryShopContext>());
}

Hacia

static LaundryShopContext()
{
  Database.SetInitializer<LaundryShopContext>(
    new DropCreateDatabaseAlways<LaundryShopContext>());
}
 54
Author: Pedigree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-09 14:56:18

Esto probablemente esté relacionado con su base de datos que no contiene la tabla _MigrationHistory (que se puede ver usando SQL Server Management Studio en Tablas > Tablas del sistema).

No estoy seguro de cómo está administrando la base de datos, pero si todavía está en desarrollo y utilizando Migraciones EF, una solución rápida es eliminar la base de datos y ejecutar Update-Database que recreará toda la base de datos y agregará la tabla _MigrationHistory.

Si desea evitar que EF ejecute esta comprobación, puede agregue esto a su clase DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
 13
Author: Judo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-28 04:34:06

Si, como yo, esto es causado por comenzar con Code First y cambiar a Database First development mid-project.. todo esto es causado por una simple línea. Si necesita mantener su base de datos y sus datos comente la siguiente línea:

Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());

De esta sección de su Modelo.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }
    static ApplicationDbContext()
    {
        // Set the database intializer which is run once during application start
        // This seeds the database with admin user credentials and admin role
        //   Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

Esto sucederá a menudo al comenzar con los modelos de identidad incorporados. Una vez que los haga funcionar, puede eliminar esa línea para mantenerla intacta y conservar la funcionalidad. Si su cambios de modelo, sin embargo, su base de datos tendrá que ser configurada para que coincida.. algo que está haciendo en el desarrollo de Base de datos Primero de todos modos!

 10
Author: Jason Conville,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-16 01:48:54

Esto también puede suceder si está intentando inicializar el contexto en una base de datos previamente existente del mismo nombre pero que se creó con otra base de código. Esta es la razón por la que cambiar de DropCreateDatabaseIfModelChanges a DropCreateDatabaseAlways funciona, esta última configuración hace que la base de datos se vuelva a crear sin importar qué, evitando cualquier tipo de control de versiones de la base de datos que pueda estar causando este problema.

 10
Author: Stark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-07 15:41:47

Sé que llego tarde a la fiesta, pero me encontré con el mismo error, y mi base de datos ya tenía una tabla de historial de migración.

El error también puede indicar una clave de contexto incorrecta en la tabla de historial. Esto puede suceder si mueve la clase de contexto de la base de datos a otro espacio de nombres, como hice mientras refactorizaba.

La actualización del valor ContextKey en la tabla MigrationHistory al nuevo espacio de nombres del contexto de la base de datos solucionó el problema para mí.

Esta solución no requiere que deseche el contenido de la base de datos, por lo que puede ser preferible a la solución DropCreateDatabaseAlways.

 1
Author: Jens Ehrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-15 14:33:14

Tengo este error cuando añado
ContextKey = "MyProject.Repository.Common.DbContextA";

A la Configuración.cs. Después de quitar esa línea, funciona.

 0
Author: Richard D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-23 21:45:38

He intentado debajo de 3 pasos . Funciona para mí.. Ejecute los siguientes comandos en la consola del administrador de paquetes 1. enable-migraciones 2. actualización-base de datos-detallada 3. add-migration initialmigrations-ignorechanges

NOTA: Mi escenario es que ya he creado la base de datos/tablas (usando el primer enfoque de código (usando una biblioteca de contexto de base de datos compartida). Estoy tratando de usar la biblioteca en otra aplicación y otra base de datos. Sincronicé manualmente el primer db en el segundo.. por eso me encontré con este problema.

 0
Author: Satheesh K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-11 07:58:56
CreateDatabaseIfNotExists<ApplicationDbContext>();
 -2
Author: user3778502,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-13 02:42:23