Первые миграции кода EF не выполняются после развертывания в Azure
У меня есть две папки для моих миграций (AuthContext и UserProfileContext), каждая из которых имеет свою собственную миграцию и некоторые пользовательские sql для запуска впоследствии для миграции данных и еще много чего.
Это отлично работает при использовании консоли диспетчера пакетов. я
- Восстановить с производства
- Запустите Update-Database -ConfigurationTypeName Migrations.Auth.Configuration
- Запустите Update-Database -ConfigurationTypeName Migrations.UserProfile.Configuration
Тогда все в новой базе очень довольны, миграции выполняются, данные перемешиваются там, где это необходимо.
Я попытался проверить миграции на публикацию:
- Восстановить производство в базе данных разработчиков
- Одна строка подключения (все контексты используют одно и то же), указывающая на базу данных dev
- Опубликовать на лазурном веб-сайте
- Установите флажок для Применить код первой миграции
- Выбрал эту единственную строку подключения
Хорошо, это опубликовано хорошо; однако когда я пошел посмотреть базу данных, ничего не произошло! Он не создал необходимые таблицы, столбцы или перемещения данных.
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.
В нашем случае первое было правильным, но второе содержало неправильный экземпляр базы данных, потому что он был перенесен из операции клонирования службы приложений. Следовательно, переносилась неправильная база данных.