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 Management Studio 在 Tables > System Tables 中查看)。

不确定您是如何管理数据库的,但如果您仍处于开发阶段并使用 EF 迁移,一个快速的解决方案是删除数据库并运行 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 开发中期项目造成的。这都是由一条简单的线引起的。如果您需要保留数据库及其数据,请注释掉以下行:

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

这在开始使用内置身份模型时经常发生。一旦让它们工作,您可以删除该行以保持其完整但保留功能。但是,如果您的模型发生更改,则必须将您的数据库配置为匹配.. 无论如何,您在 Database First 开发中正在做的事情!

于 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-migrations 2. update-database -verbose 3. add-migration initialmigrations -ignorechanges

注意:我的场景是我已经创建了数据库/表(使用代码优先方法(使用共享数据库上下文库)。我尝试在另一个应用程序和另一个数据库中使用该库。我手动将第一个数据库同步到第二个数据库......就是这样为什么我遇到这个问题。

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