33

アプリケーションを実行するたびに表示され続けるこのエラーメッセージがあります。エンティティを使用しています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

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

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

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

質問で見逃した詳細があれば、コメントしてください。それを含めることができます。

4

8 に答える 8

58

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

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

の中へ

static LaundryShopContext()
{
  Database.SetInitializer<LaundryShopContext>(
    new DropCreateDatabaseAlways<LaundryShopContext>());
}
于 2012-12-28T04:45:25.763 に答える
14

これは、データベースに_MigrationHistoryテーブルが含まれていないことに関連している可能性があります(SQL Server ManagementStudioを使用して[テーブル]>[システムテーブル]で表示できます)。

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

EFがこのチェックを実行するのを避けたい場合は、これをDbContextクラスに追加できます。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
于 2012-12-28T04:34:06.060 に答える
12

私のように、これが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モデルから始めるときによく発生します。それらが機能するようになったら、その行を削除して、機能を維持しながらそのまま維持することができます。ただし、モデルが変更された場合は、データベースを一致するように構成する必要があります。とにかく、データベースファースト開発で行っていることです。

于 2015-09-16T01:48:54.683 に答える
10

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

于 2014-02-24T23:26:54.303 に答える
4

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

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

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

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

于 2018-02-15T14:33:14.870 に答える
0

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

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

于 2017-03-23T21:45:38.790 に答える
0

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

注:私のシナリオでは、すでにdb /テーブルを作成しています(コードファーストアプローチを使用(共有DBコンテキストライブラリを使用)。別のアプリケーションと別のデータベースでライブラリを使用しようとしています。最初のデータベースを手動で2番目に同期しました。なぜ私はこの問題に遭遇したのですか。

于 2017-09-11T07:58:56.340 に答える
-3
CreateDatabaseIfNotExists<ApplicationDbContext>();
于 2015-03-07T21:00:37.053 に答える