Первые миграции кода EF не выполняются после развертывания в Azure

У меня есть две папки для моих миграций (AuthContext и UserProfileContext), каждая из которых имеет свою собственную миграцию и некоторые пользовательские sql для запуска впоследствии для миграции данных и еще много чего.

Это отлично работает при использовании консоли диспетчера пакетов. я

  1. Восстановить с производства
  2. Запустите Update-Database -ConfigurationTypeName Migrations.Auth.Configuration
  3. Запустите Update-Database -ConfigurationTypeName Migrations.UserProfile.Configuration

Тогда все в новой базе очень довольны, миграции выполняются, данные перемешиваются там, где это необходимо.

Я попытался проверить миграции на публикацию:

  1. Восстановить производство в базе данных разработчиков
  2. Одна строка подключения (все контексты используют одно и то же), указывающая на базу данных dev
  3. Опубликовать на лазурном веб-сайте
  4. Установите флажок для Применить код первой миграции
  5. Выбрал эту единственную строку подключения

Хорошо, это опубликовано хорошо; однако когда я пошел посмотреть базу данных, ничего не произошло! Он не создал необходимые таблицы, столбцы или перемещения данных.

TLDR; Первые миграции кода не выполняются после публикации в Azure

Обновление 1 Я пробовал любую комбинацию из нижеприведенного: только одна строка подключения, поэтому я предполагаю, что это не проблема, и проверка выполнения проверена.

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

Я видел пару ссылок о необходимости добавить что-то в мой класс Startup, но я не уверен, что делать дальше.

Обновление 2 Я решил одну проблему, добавив "Persist Security Info=True" в строку подключения. Теперь он фактически подключается к базе данных и вызывает мой API; однако миграция не выполняется. Я подключил отладчик к среде разработки Azure и пошагово прошел... на моей первой базе данных он вызывает шаги в класс Configuration для рассматриваемой миграции, затем barfs, и я не могу отследить ошибку.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    MigrationsDirectory = @"Migrations\Auth";
    ContextKey = "AuthContext";
}

Обновление 3

Ладно, копаемся и при первом попадании в базу данных мы ошибаемся. Да, это имеет смысл, поскольку модель изменилась, но у меня есть миграции, которые включены и проверены! Опять же, он работает нормально при запуске "Update-Database" из консоли диспетчера пакетов, но не при использовании "Выполнить первые миграции кода" во время публикации в Azure.

Модель, поддерживающая контекст 'AuthContext', изменилась с момента создания базы данных. Рекомендуется использовать Code First Migrations для обновления базы данных ( http://go.microsoft.com/fwlink/?LinkId=238269).

Обновление 4 Хорошо, я нашел корень проблемы здесь. VS настраивает дополнительный атрибут web.config для databaseInitializer только для одного из моих контекстов базы данных, а тот, который не упомянут, фактически попадает первым из моего приложения.

Так что теперь я должен выяснить, как сделать так, чтобы он включал несколько контекстов или объединял все мои вещи в одном контексте.

2 ответа

Решение

Решено! Чтобы подвести итог решения для потомков:

Enable Code First Migrations включает их только для одной базовой строки подключения на каждый флажок, независимо от того, сколько контекстов имеет миграции для этой базовой строки подключения. Так что в моем случае я разбил эти два вопроса на две разные строки подключения.

Затем я столкнулся с другими ошибками и определил, что если вы изменяете строку базового соединения на идентификационную информацию asp, поддерживающую модель, вам нужно включить (один раз опубликовать) дополнительный флаг base("AuthContext", throwIfV1Schema: false)

Ответ на этот пост не очень подробный.

В этой статье объясняется, что мне нужно было сделать, чтобы решить проблему, подобную этой: https://blogs.msdn.microsoft.com/webdev/2014/04/08/ef-code-first-migrations-deployment-to-an-azure-cloud-service/

Я примерно опишу шаги, которые я должен был предпринять ниже:

Шаг 1 Добавьте строки подключения к dbContexts, в моей ситуации они были одинаковыми.

введите описание изображения здесь

Шаг 2 Добавьте это в ваш web.config

 <appSettings>
    <add key="MigrateDatabaseToLatestVersion" value="true"/>
  </appSettings>

Шаг 3 И добавьте это в конец вашего global.asax.cs / Startup.cs(запуск OWIN)

    var configuration = new Migrations.Configuration();
    var migrator = new DbMigrator(configuration);
    migrator.Update();

Для тех, кто столкнулся с этой проблемой и мог упустить из виду следующее: убедитесь, что вы правильно установили строку подключения в файле Web.config и / или в параметрах приложения в Azure. Сюда входят DefaultConnection и DefaultConnection_DatabasePublish.

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