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

Ped*_*ree 32 .net c# 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
Run Code Online (Sandbox Code Playgroud)

当我创建一个名为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ped*_*ree 55

我通过改变找到了代码

static LaundryShopContext()
{
  Database.SetInitializer<LaundryShopContext>(
    new DropCreateDatabaseIfModelChanges<LaundryShopContext>());
}
Run Code Online (Sandbox Code Playgroud)

static LaundryShopContext()
{
  Database.SetInitializer<LaundryShopContext>(
    new DropCreateDatabaseAlways<LaundryShopContext>());
}
Run Code Online (Sandbox Code Playgroud)

  • +1提示.但我认为,我们隐藏了错误,而不是解决错误.*IfModelChanges*的问题在于它依赖于*_MigrationHistory*表.我们正在躲避**总是**创建数据库,因此不需要历史.但是,一旦使用*Always*运行,我认为应该创建历史表.它不在我的情况下,但是......我只看到表:*MSreplication_options*,*spt_fallback_db*,*spt_fallback_dev*,*spt_fallback_usg*和*spt_monitor*. (3认同)
  • @Pedigree,当您将整个方案从`DropCreateDatabaseIfModelChanges <LaundryShopContext>()`更改为`DropCreateDatabaseAlways <LaundryShopContext>()`时,如何将此标记为答案.两种方案都有完全不同的含义.如何通过改变整个场景将其标记为aswer.和@KonradViltersten当一个新数据库是`Always`创建时,为什么你会期望它创建一个`_Migration`(History)文件夹?我的意思是为什么在创建新数据库时你需要知道历史? (3认同)
  • 谢谢......它奏效了.但它应该对我有用'ifmodelchanges`因为它以前一直在工作. (2认同)

Jud*_*udo 14

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

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

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
Run Code Online (Sandbox Code Playgroud)


Jas*_*lle 11

如果像我一样,这是由Code First开始并在项目中改为Database First开发引起的......这一切都是由一条简单的线引起的.如果您需要将数据库及其数据注释掉以下行:

Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
Run Code Online (Sandbox Code Playgroud)

来自模型的这一部分.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Sta*_*ark 10

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

  • 我也遇到过这种情况.我将其更改为Always,运行它,然后将其更改回IfModelChanges.现在工作正常. (2认同)

Jen*_*ich 5

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

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

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

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