EF5获取此错误消息:无法检查模型兼容性,因为数据库不包含模型元数据

时间:2012-12-28 04:06:09

标签: c# .net entity-framework entity-framework-5

我每次运行应用程序时都会显示此错误消息。我使用了实体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);
    }
}

为了复制应用程序,我已经包含了available for download的项目文件。所以这个问题不会充满代码。

如果我在问题中遗漏了详细信息,请发表评论,以便我可以加入。

8 个答案:

答案 0 :(得分:55)

我通过更改

找到了代码
static LaundryShopContext()
{
  Database.SetInitializer<LaundryShopContext>(
    new DropCreateDatabaseIfModelChanges<LaundryShopContext>());
}

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

答案 1 :(得分:14)

这可能与您的数据库不包含_MigrationHistory表(可以使用表中的SQL Server Management Studio和系统表查看)相关。

不确定您是如何管理数据库的,但如果您仍处于开发阶段并使用EF迁移,则快速解决方案是删除数据库并运行Update-Database,它将重新创建整个数据库并添加_MigrationHistory表。

如果您想避免EF运行此检查,您可以将其添加到DbContext类

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

答案 2 :(得分:11)

如果像我一样,这是由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开发中正在做的事情!

答案 3 :(得分:10)

如果您尝试针对先前存在的同名数据库初始化上下文,但是使用其他代码库创建了这种情况,也会发生这种情况。 这就是为什么从DropCreateDatabaseIfModelChanges更改为DropCreateDatabaseAlways的原因,后一种配置会导致无论如何重新创建数据库,从而绕过可能导致此问题的任何类型的数据库版本控制。

答案 4 :(得分:2)

我知道我迟到了,但我遇到了同样的错误,我的数据库已经有了迁移历史记录表。

该错误还可能表示历史记录表中的上下文键不正确。如果将数据库上下文类移动到另一个命名空间,就像我在重构时所做的那样,可能会发生这种情况。

ContextKey表中的MigrationHistory值更新为数据库上下文的新命名空间为我解决了问题

此解决方案不要求您丢弃数据库内容,因此可能优先于DropCreateDatabaseAlways解决方案。

答案 5 :(得分:0)

我添加时出现此错误 ContextKey = "MyProject.Repository.Common.DbContextA";

到Configuration.cs。删除该行后,它可以正常工作。

答案 6 :(得分:0)

我尝试了以下3个步骤。 它适用于我..在包管理器控制台中运行以下命令 1.启用迁移 2. update-database -verbose 3. add-migration initialmigrations -ignorechanges

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

答案 7 :(得分:-3)

CreateDatabaseIfNotExists<ApplicationDbContext>();