Отключение миграций

Я пишу веб-API, прикрепленный к базе данных, которую я создал с помощью Model First.

Будучи новичком, я путал Model First с Code First.

Поскольку это мое первое EF/ веб-приложение, я не осознавал, что миграция еще не была реализована в Model First, и я следовал процедуре его реализации. Когда он запустился, я получил несколько ошибок, посмотрел их и только потом понял, что мне нужно будет их снова удалить.

Следуя чьим-то инструкциям, я удалил папку базы данных и таблицу _migrationHistory из базы данных.

Но теперь я получаю следующее исключение, когда в базе данных отсутствует таблица _migrationhistory.

protected void Application_Start()
{
  // Call initializer
  Database.SetInitializer(new PulseDbInitializer());
  new ApplicationDbContext().Database.Initialize(true); <- error here

  AreaRegistration.RegisterAllAreas();
  GlobalConfiguration.Configure(WebApiConfig.Register);
  FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  RouteConfig.RegisterRoutes(RouteTable.Routes);
  BundleConfig.RegisterBundles(BundleTable.Bundles);
}

"Исключение типа" System.NotSupportedException "возникло в EntityFramework.dll, но не было обработано в коде пользователя. Дополнительная информация: Невозможно проверить совместимость модели, поскольку база данных не содержит метаданных модели. Совместимость модели можно проверить только для баз данных, созданных с использованием кода. Первый или код первых миграций."

Ниже приведено частичное описание моего инициализатора

public partial class PulseDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>, IPulseDbInit
//public partial class PulseDbInitializer :DropCreateDatabaseAlways<ApplicationDbContext>, IPulseDbInit
{
  private ApplicationDbContext _context;
  protected override void Seed(ApplicationDbContext context)
  {
    _context = context;
    var pid = new PulseDbInitializionData(context);
    pid.Init(this);
  }
}// class PulseDbInitializer

Кажется, что приложение пытается использовать миграции (потому что оно создает таблицу _migrationhistory), хотя я удалил подпапку миграций. Будучи новичком в этом, я не уверен, куда идти. Я знаю, что создал свой инициализатор, см. Выше, так что я что-то упустил?

РЕДАКТИРОВАТЬ - слишком долго для комментария

Я не уверен, что мы понимаем друг друга.

Проще говоря, я не знаю, что генерирует таблицу _MigrationHistory в моей базе данных как afaik, если я удаляю подкаталог Migration из своего проекта и удаляю базу данных, тогда я подумал, что это все, что мне нужно сделать, чтобы отбросить миграции.

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

Пока я не добавил миграцию, я не заметил эту таблицу _MigrationHistory, и у меня нет ни малейшего понятия, добавила ли команда add -igration какой-либо код в мой проект, который мне нужно удалить или изменить (я действительно ненавижу, когда что-то происходит, и мне ничего не говорят именно то, что было сделано в каком-то журнале. Пожалуйста, майкрософт, для дальнейшего использования)

Или я совершенно не прав, и таблица _MigrationHistory всегда была там, но я никогда не замечал? Кажется, все работает, пока я не убираю стол.

1 ответ

Ваш инициализатор наследуется от DropCreateDatabaseIfModelChanges, который проверяет изменения модели. Поскольку вы не используете код в первую очередь, вы не можете проверять изменения модели в коде (поскольку ваш код не определяет модель, которая была бы первой в коде... модель определяет код - это модель первая -)... так что вам нужно реализовать свой IDatabaseInitializer который только проверяет (например), что база данных существует:

public partial class PulseDbInitializer : IDatabaseInitializer<ApplicationDbContext>, IPulseDbInit
{
  public void InitializeDatabase(ApplicationDbContext context)
  {
    var exists = new DatabaseTableChecker().AnyModelTableExists(context.InternalContext);
    if (exists == DatabaseExistenceState.Exists)
    {
       // maybe check if certain data exists and call the `Seed` method if
       // it doesn't
       return;
    }

    // Throw some error if it doesn't exist
  }

  protected override void Seed(ApplicationDbContext context)
  {
    _context = context;
    var pid = new PulseDbInitializionData(context);
    pid.Init(this);
  }
}
Другие вопросы по тегам