Подтвердить что ты не робот

EF5 Получение этого сообщения об ошибке: Совместимость модели не может быть проверена, поскольку база данных не содержит метаданных модели

У меня есть это сообщение об ошибке, которое постоянно отображается при каждом запуске приложения. Я использую 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

Эта ошибка началась, когда я создал объект, называемый счет-фактурой. Здесь полный код объекта,

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

Чтобы реплицировать приложение, я включил файл проекта, который доступен для скачивания. И поэтому этот вопрос не будет заполнен кодом.

Если есть детали, которые я пропустил в вопросе, прокомментируйте, поэтому я могу включить его.

4b9b3361

Ответ 1

Я нашел код, работающий, изменив

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

в

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

Ответ 2

Это, вероятно, связано с вашей базой данных, не содержащей таблицу _MigrationHistory (которую можно просмотреть с помощью SQL Server Management Studio в таблицах > Системных таблицах).

Не знаете, как вы управляете базой данных, но если вы все еще находитесь в разработке и используете EF Migrations, быстрое решение - удалить базу данных и запустить Update-Database, которая воссоздает всю базу данных и добавит таблицу _MigrationHistory.

Если вы хотите избежать выполнения этой проверки EF, вы можете добавить это в свой класс DbContext

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

Ответ 3

Это также может произойти, если вы пытаетесь инициализировать контекст с ранее существующей базой данных с тем же именем, но это было создано с другой базой кода. Вот почему работает изменение DropCreateDatabaseIfModelChanges в DropCreateDatabaseAlways, последняя конфигурация заставляет базу данных воссоздаваться независимо от того, что в обход любого типа управления версиями базы данных может вызвать эту проблему.

Ответ 4

Если, как и я, это вызвано тем, что началось с Code First и менялось в середине проекта Project 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();
    }
}

Это часто случается при запуске со встроенными моделями идентичности. После того, как вы их заработаете, вы можете удалить эту строку, чтобы сохранить ее, но сохранить функциональность. Однако, если ваша модель изменится, ваша база данных должна быть настроена так, чтобы она соответствовала.. что-то, что вы делаете в базе данных Сначала в любом случае!

Ответ 5

Я получил эту ошибку, когда добавляю ContextKey = "MyProject.Repository.Common.DbContextA";

в Configuration.cs. После удаления этой строки он работает.

Ответ 6

Я пробовал ниже 3 шага. Он работает для меня. Запустите следующие команды в консоли диспетчера пакетов 1. enable-migrations 2. update-database -verbose 3. add-migration initialmigrations -ignorechanges

ПРИМЕЧАНИЕ. Моим сценарием я уже создал db/tables (используя первый подход к коду (используя общую библиотеку контекста DB). Я пытаюсь использовать библиотеку в другом приложении и другой базе данных. Я вручную синхронизировал первый db на второй.. Вот почему я столкнулся с этой проблемой.

Ответ 7

CreateDatabaseIfNotExists<ApplicationDbContext>();