EF5 Ottenere questo messaggio di errore: La compatibilità del modello non può essere verificata perché il database non contiene i metadati del modello

Ho questo messaggio di errore che continua a essere visualizzato ogni volta che eseguo l’applicazione. Sto utilizzando Entity Framework 5: Code First

Ecco il messaggio di errore,

 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.b__0(DbContext c) at System.Data.Entity.Internal.InternalContext.c__DisplayClass8.b__6() at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() at System.Data.Entity.Internal.LazyInternalContext.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 

Questo errore è iniziato quando ho creato un’entity framework chiamata fattura. Ecco il codice completo dell’entity framework,

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

Per replicare l’applicazione, ho incluso il file di progetto che è disponibile per il download . E quindi questa domanda non sarà piena di codice.

Se ci sono dettagli che ho perso nella domanda, si prega di commentare in modo da poterlo includere.

Ho trovato che il codice funzionava cambiando

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

in

 static LaundryShopContext() { Database.SetInitializer( new DropCreateDatabaseAlways()); } 

Ciò è probabilmente correlato al database che non contiene la tabella _MigrationHistory (che può essere visualizzata utilizzando SQL Server Management Studio in Tabelle> Tabelle di sistema).

Non sei sicuro di come gestisci il database, ma se sei ancora in fase di sviluppo e utilizzi le Migrazioni EF, una soluzione rapida è quella di eliminare il database ed eseguire Update-Database che ricrea l’intero database e aggiunge la tabella _MigrationHistory.

Se si desidera evitare che EF esegua questo controllo, è ansible aggiungerlo alla class DbContext

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); } 

Se, come me, questo è causato dall’iniziare con Code First e passare al progetto di sviluppo del database First, tutto questo è causato da una sola riga. Se è necessario mantenere il database e i relativi dati, commentare la seguente riga:

 Database.SetInitializer(new ApplicationDbInitializer()); 

da questa sezione del tuo modello.

 public class ApplicationDbContext : IdentityDbContext { 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(new ApplicationDbInitializer()); } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } } 

Questo accadrà spesso quando si inizia con i modelli di id quadro incorporati. Una volta che li hai fatti funzionare, puoi rimuovere quella linea per mantenerla intatta pur mantenendo la funzionalità. Se il tuo modello cambia, tuttavia, il tuo database dovrà essere configurato in modo che corrisponda .. qualcosa che stai facendo nello sviluppo del Database First comunque!

Questo può accadere anche se si sta tentando di inizializzare il contesto con un database precedentemente esistente con lo stesso nome ma che è stato creato con un’altra base di codice. Questo è il motivo per cui il passaggio da DropCreateDatabaseIfModelChanges a DropCreateDatabaseAlways funziona, quest’ultima configurazione fa sì che il database venga ricreato indipendentemente da cosa, ignorando qualsiasi tipo di controllo del database che potrebbe causare questo problema.

So di essere in ritardo per la festa, ma mi sono imbattuto nello stesso errore e il mio database aveva già una tabella della cronologia delle migrazioni.

L’errore potrebbe anche indicare una chiave di contesto non corretta nella tabella della cronologia. Questo può accadere se si sposta la class di contesto del database su un altro spazio dei nomi, come ho fatto durante il refactoring.

L’aggiornamento del valore ContextKey nella tabella MigrationHistory nel nuovo spazio dei nomi del contesto del database ha risolto il problema per me .

Questa soluzione non richiede di scartare i contenuti del database, quindi è preferibile utilizzare la soluzione DropCreateDatabaseAlways .

Ho ricevuto questo errore quando aggiungo
ContextKey = "MyProject.Repository.Common.DbContextA";

a Configuration.cs. Dopo aver rimosso quella linea, funziona.

Ho provato sotto 3 passaggi. Funziona per me .. Esegui i seguenti comandi nella console del gestore pacchetti 1. enable-migrations 2. update-database -verbose 3. add-migration initialmigrations -ignorechanges

NOTA: Il mio scenario è che ho già creato il db / tabelle (usando il primo approccio al codice (usando una libreria di contesto DB condivisa). Sto provando ad usare la libreria in un’altra applicazione e in un altro database. perché ho riscontrato questo problema

 CreateDatabaseIfNotExists();