web-dev-qa-db-ja.com

EF5このエラーメッセージの取得:データベースにモデルメタデータが含まれていないため、モデルの互換性を確認できません

アプリケーションを実行するたびに表示され続けるこのエラーメッセージがあります。エンティティFramework 5: Code Firstを使用しています

エラーメッセージは次のとおりです。

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

このエラーは、請求書というエンティティを作成したときに開始されました。エンティティの完全なコードは次のとおりです。

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

アプリケーションを複製するために、 ダウンロード可能 のプロジェクトファイルを含めました。したがって、この質問にはコードがいっぱいではありません。

質問で見逃した詳細がある場合は、コメントを追加してください。

32
Pedigree

変更することでコードが機能していることがわかりました

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

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

これはおそらく、_MigrationHistoryテーブルを含まないデータベースに関連しています(これは、[テーブル]> [システムテーブル]でSQL Server Management Studioを使用して表示できます)。

データベースの管理方法はわかりませんが、まだ開発中でEF移行を使用している場合は、データベースを削除してUpdate-Databaseを実行し、データベース全体を再作成して_MigrationHistoryテーブルを追加します。

EFがこのチェックを実行しないようにするには、これをDbContextクラスに追加します。

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

私のように、これがCode Firstから開始し、プロジェクトの途中でDatabase First開発に変更したことが原因である場合、これはすべて1行で発生します。データベースとそのデータを保持する必要がある場合は、次の行をコメントアウトします。

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

モデルのこのセクションから。

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

これは、組み込みのIDモデルで開始するときに頻繁に発生します。それらが機能するようになったら、その行を削除して、機能を維持したままそのままにしておくことができます。ただし、モデルが変更された場合、データベースを一致するように構成する必要があります。

11
Jason Conville

これは、同じ名前の既存のデータベースに対してコンテキストを初期化しようとしているが、別のコードベースで作成された場合にも発生する可能性があります。これが、DropCreateDatabaseIfModelChangesからDropCreateDatabaseAlwaysへの変更が機能する理由です。後者の構成では、この問題を引き起こす可能性のあるデータベースのバージョン管理をバイパスして、何があってもデータベースが再作成されます。

10
Stark

私はパーティーに遅れていることは知っていますが、同じエラーに出会ったばかりで、データベースにはすでに移行履歴テーブルがありました。

エラーは、履歴テーブル内の不正なコンテキストキーを示している場合もあります。これは、リファクタリング中に行ったように、データベースコンテキストクラスを別のネームスペースに移動した場合に発生する可能性があります。

ContextKeyテーブルのMigrationHistory値をデータベースコンテキストの新しいネームスペースに更新すると、問題が修正されました

このソリューションでは、データベースの内容を破棄する必要がないため、DropCreateDatabaseAlwaysソリューションよりも優先される場合があります。

2
Jens Ehrich

追加するとこのエラーが発生しました
ContextKey = "MyProject.Repository.Common.DbContextA";

configuration.csへ。その行を削除すると、機能します。

0
Richard D

私は以下の3つのステップを試しました。パッケージマネージャーコンソールで次のコマンドを実行します1. enable-migrations 2. update-database -verbose 3. add-migration initialmigrations -ignorechanges

注:私のシナリオでは、db/tablesを既に作成しています(コードを使用した最初のアプローチ(共有DBコンテキストライブラリを使用)。ライブラリを別のアプリケーションおよび別のデータベースで使用しようとしています。この問題に遭遇した理由。

0
Satheesh K