web-dev-qa-db-fra.com

EF5 Obtention de ce message d'erreur: Impossible de vérifier la compatibilité du modèle car la base de données ne contient pas de métadonnées de modèle

J'ai ce message d'erreur qui continue à s'afficher chaque fois que je lance l'application. J'utilise Entity Framework 5: Code First

Voici le message d'erreur,

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

Cette erreur a commencé lorsque j'ai créé une entité appelée facture. Voici le code complet de l'entité,

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

Afin de reproduire l'application, j'ai inclus le fichier de projet qui est disponible au téléchargement . Et donc cette question ne sera pas pleine de code.

S'il y a des détails que j'ai manqués dans la question, veuillez commenter pour que je puisse l'inclure. 

31
Pedigree

J'ai trouvé le code qui fonctionne en changeant 

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

dans

static LaundryShopContext()
{
  Database.SetInitializer<LaundryShopContext>(
    new DropCreateDatabaseAlways<LaundryShopContext>());
}
54
Pedigree

Cela est probablement lié au fait que votre base de données ne contient pas la table _MigrationHistory (pouvant être visualisée à l'aide de SQL Server Management Studio dans Tables> Tables système). 

Vous ne savez pas comment vous gérez la base de données, mais si vous êtes toujours en développement et utilisez EF Migrations, une solution rapide consiste à supprimer la base de données et à exécuter Update-Database, qui recréera la base de données complète et ajoutera la table _MigrationHistory.

Si vous voulez éviter que EF exécute cette vérification, vous pouvez l'ajouter à votre classe DbContext. 

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
13
Judo

Si, comme moi, cela est provoqué en commençant par Code First et en passant à Database First en cours de développement à mi-projet, tout cela est causé par une simple ligne. Si vous devez conserver votre base de données et ses données, commentez la ligne suivante:

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

de cette section de votre modèle. 

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

Cela se produira souvent lors du démarrage avec les modèles d'identité intégrés. Une fois que vous les faites fonctionner, vous pouvez supprimer cette ligne pour la conserver intacte tout en conservant les fonctionnalités. Cependant, si votre modèle change, votre base de données devra être configurée pour correspondre à ce que vous faites dans le développement de la base de données d'abord!

11
Jason Conville

Cela peut également se produire si vous essayez d'initialiser le contexte avec une base de données existante portant le même nom mais créée avec un autre codebase . recréé quoi qu'il arrive, en contournant tout type de gestion de versions de base de données pouvant être à l'origine de ce problème.

10
Stark

Je sais que je suis en retard à la fête, mais je viens de rencontrer la même erreur et ma base de données contenait déjà une table d'historique de migration.

L'erreur peut également indiquer une clé de contexte incorrecte dans la table d'historique. Cela peut se produire si vous déplacez la classe de contexte de base de données vers un autre espace de noms, comme ce fut le cas lors du refactoring. 

La mise à jour de la valeur ContextKey de la table MigrationHistory vers le nouvel espace de noms du contexte de la base de données a résolu le problème pour moi .

Cette solution ne vous oblige pas à ignorer le contenu de la base de données, elle peut donc être préférée à la solution DropCreateDatabaseAlways.

2
Jens Ehrich

J'ai cette erreur quand j'ajoute
ContextKey = "MyProject.Repository.Common.DbContextA"; 

à Configuration.cs. Après avoir supprimé cette ligne, cela fonctionne.

0
Richard D

J'ai essayé ci-dessous 3 étapes. Cela fonctionne pour moi .. Exécutez les commandes suivantes dans la console du gestionnaire de packages 1. enable-migrations 2. update-database -verbose 3. add-migration initialmigrations -ignorechanges

NOTE: Mon scénario est que j'ai déjà créé la base de données/tables (en utilisant la première approche de code (en utilisant une bibliothèque de contexte DB partagée). J'essaie d'utiliser la bibliothèque dans une autre application et une autre base de données. J'ai synchronisé manuellement la première base de données en seconde. pourquoi j'ai rencontré ce problème. 

0
Satheesh K