簡體   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