繁体   English   中英

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

[英]EF5 Getting this error message: Model compatibility cannot be checked because the database does not contain model metadata

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

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

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

我通过改变找到了代码

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CreateDatabaseIfNotExists<ApplicationDbContext>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM