Asp.net Seeding db Entity Framework не работает

Я хочу заполнить базу данных данными по умолчанию, но получаю исключение.

Я добавил этот класс инициализации в пространство имен DAL.

public class MyModelInitialise : DropCreateDatabaseIfModelChanges<MyModelContext>

{

    protected override void Seed(MyModelContext context)

    {

        base.Seed(context);



        var MyMarks = new List<MyMark>

        {

         new Mark{ Name="Mark1", Value="250"},

         new Mark{ Name="Mark2", Value="350"},

         new Mark{ Name="Mark3", Value="450"}

        };

        Marks.ForEach(bm => context.Marks.Add(bm));



        context.SaveChanges();

    }

}

Я добавил этот инициализатор в запуск приложения

protected void Application_Start()

   {

        Database.SetInitializer<MyModelContext>(new MyModelInitialise());

   }

Я получаю следующую ошибку при вызове этого

Model compatibility cannot be checked because the DbContext instance was not created
using Code First patterns. DbContext instances created from an ObjectContext or using 
an EDMX file cannot be checked for compatibility.

person Sumit Chourasia    schedule 12.11.2013    source источник


Ответы (2)


Убедитесь, что у вас есть public DbSet<MyMark> MyMarks { get; set; } в классе MyModelContext.

person Andy Refuerzo    schedule 12.11.2013

Вместо этого используйте интерфейс IDatabaseInitializer<TContext>, так как DropCreateDatabaseIfModelChanges работает только с моделями Code-First:

public class MyModelInitialise : IDatabaseInitializer<MyModelContext>
{
  public void InitializeDatabase(MyModelContext context)
  {    
    // Runs everytime so just avoid if the table already has records.
    if (context.Marks.Count() == 0)
    {
      var MyMarks = new List<MyMark>
      {
        new Mark{ Name="Mark1", Value="250"},
        new Mark{ Name="Mark2", Value="350"},
        new Mark{ Name="Mark3", Value="450"}
      };

      Marks.ForEach(bm => context.Marks.Add(bm));
      context.SaveChanges();
    }
  }
}

Оставьте Database.SetInitializer точно таким же. Вы, вероятно, должны обернуть его в директиву препроцессора, чтобы гарантировать, что он никогда не попадет в производственный код.

#if DEBUG
      Database.SetInitializer<MyModelContext>(new MyModelInitialise());
#endif
person BrutalDev    schedule 09.05.2014