Код Asp.Net EF Первая непрерывная интеграция с VSTS - Azure Sql Db не развертывается
У меня возникают проблемы с запуском миграций для создания / обновления базы данных Sql Db, размещенной на Azure. Они отлично работают локально для моего LocalDb, но, похоже, полностью игнорируются при выпуске в Azure.
Подробности: - Asp.Net MVC 5.2.3 - Entity Framework 6.1.3 - Visual Studio Team Services (онлайн) - Веб-приложение Azure и база данных SQL Azure (в рамках подписки Imagine / Dreamspark)
Я создал другое приложение, которое не использовало CI, но использовало функцию публикации в Visual Studio, и оно публиковалось нормально и работало. С тех пор я удалил это веб-приложение и базу данных из Azure, поскольку подписка допускает только одну базу данных.
Я думаю, что это может быть что-то, что я упускаю при настройке определения сборки в VSTS, я просто не уверен, что.
Я пытался:
- https://blogs.msdn.microsoft.com/webdev/2014/04/08/ef-code-first-migrations-deployment-to-an-azure-cloud-service/ (это ничего не сделало для меня)
- https://www.benday.com/2016/11/07/using-tfs-build-to-deploy-entity-framework-database-migrations-with-migrate-exe/ (я получил ошибку сборки, которую я не сделал в моей папке bin нет определения версии)
... а также куча других (у меня больше нет открытых окон, или я бы тоже их связал).
Мои текущие шаги сборки включают в себя:
- Восстановление NuGet - установщик NuGet
- Решение для сборки - Visual Studio Build
- Тестовые сборки - Visual Studio Test
- Путь к символам публикации - источники индекса и символы публикации
- Опубликовать артефакт - Опубликовать сборку артефактов
В моем локальном окружении EF работает, когда я включаю Migrations, Add-Migration, Update-Database. Я предполагаю, что ни один из вышеупомянутых шагов не делает этого, поэтому мне нужно один или несколько шагов. Блог Бена Дея, похоже, должен работать, но по какой-то причине он не находит мой файл bin/release.
Фактическое приложение развертывается в Azure просто отлично после выпуска вышеуказанного успешного определения сборки. Просто база данных полностью игнорируется. Используя SSMS, я проверяю базу данных Azure, и, хотя она существует, в ней нет ни моих таблиц, ни данных.
Что мне не хватает?
Благодарю.
** Изменить - нашел простой элемент, который мне не хватало. Мне нужно добавить строку подключения для БД в веб-приложение в Azure. Теперь он содержит мои исходные таблицы и хранит данные с использованием этих таблиц, но не переносит миграции. Итак, что-то, что я сделал за последние два дня, привело к появлению моих начальных таблиц. Теперь, чтобы вспомнить, что это было.
** 2-е редактирование - Итак, я думаю, что таблицы попали в релизную базу данных, прежде чем я исправил строку подключения в VSTS. Одна из вещей, которые я попробовал, - это создание отдельного проекта базы данных. Я думаю, что когда я нажимал это в какой-то момент, таблицы, существующие в то время, также пытались выпустить, я просто не мог их видеть, потому что я не связал приложение и базу данных вместе? В любом случае, миграция EF все еще не распознается. Я снова попробовал предложение Бена Дея, но получаю ошибку сборки:
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.
Я использую EF 6.1.3
1 ответ
Я столкнулся с этим также. Я использовал Visual Studio для публикации службы приложений Azure. После проведения некоторых исследований ( https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application) я пришел к выводу, что VS Publish преобразует вашу веб-конфигурацию, когда вы устанавливаете флажок "Обновить базу данных" в настройке публикации, добавляя строка соединения, которая ссылается на базу данных, содержащую вашу таблицу _migrations, а также элемент "contextxts" в разделе entityFramework. Вы можете увидеть, что предыдущая публикация сделала с вашим web.config, посмотрев "..obj\Release\InsertEFCodeFirstDeploy\transformed\web.config".
Поэтому, чтобы воссоздать то же самое действие при использовании определения сборки и выпуска в VSTS, я добавил 2 XDT-преобразования "вставка" в Web.Release.config в моем сервисном проекте. Моя выглядит так:
<?xml version="1.0"?>
<!-- For more information on using Web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=301874 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add name="MS_TableConnectionString_DatabasePublish" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=AzureStorageEmulatorDb45;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True"
providerName="System.Data.SqlClient" xdt:Transform="Insert" />
</connectionStrings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
<entityFramework>
<contexts xdt:Transform="Insert">
<context type="helpmeshopService.Models.helpmeshopContext, helpmeshopService">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[helpmeshopService.Models.helpmeshopContext, helpmeshopService], [helpmeshopService.Migrations.Configuration, helpmeshopService]], EntityFramework, PublicKeyToken=b77a5c561934e089">
<parameters>
<parameter value="MS_TableConnectionString_DatabasePublish" />
</parameters>
</databaseInitializer>
</context>
</contexts>
</entityFramework>
</configuration>
Затем вам нужно перейти к службе приложений "Настройки приложения" на портале Azure и добавить строку подключения с именем "MS_TableConnectionString_DatabasePublish" и установить для ее значения то же значение, что и для "MS_TableConnectionString", которое уже должно существовать в вашем настройки.