Задний план
Я создал созданный мной веб-сайт, начиная с шаблона веб-приложения .Net Core 2.0, который теперь имеет 2 проекта и 1 контекст данных:
У меня есть профиль публикации, который я использую, и когда я публикую его для промежуточной обработки, миграции обрабатываются как часть публикации, что хорошо работает для меня, поскольку приложение и схема веб-сайта обновляются за один раз.
Совсем недавно я создал второй веб-сайт, начиная с шаблона веб-приложения .Net Core 2.1, который имеет 3 проекта и 2 контекста данных.
Проблема
Я создал промежуточный профиль для 2-го веб-сайта, который для меня выглядит так же, как 1-й, но миграции не обрабатываются автоматически при публикации.
Глядя на журналы сборки, когда я публикую 1-й веб-сайт, он включает в себя раздел для создания сценариев SQL Entity Framework:
Generating Entity framework SQL Scripts...
Executing command: dotnet ef migrations script --idempotent --output "D:\Dev\dotnet\Core\foo1\Web\obj\Staging\netcoreapp2.1\win-x64\PubTmp\EFSQLScripts\Data.ApplicationDbContext.sql" --context Data.ApplicationDbContext
Generating Entity framework SQL Scripts completed successfully
Adding database (data source=VMFoo;initial catalog=com.foo1-staging;trusted_connection=True;multipleactiveresultsets=true)
Updating file (com.foo1.staging\Data.dll).
Updating file (com.foo1.staging\Data.pdb).
Updating file (com.foo1.staging\web.config).
Updating file (com.foo1.staging\Web.deps.json).
Updating file (com.foo1.staging\Web.dll).
Updating file (com.foo1.staging\Web.pdb).
Updating file (com.foo1.staging\Web.runtimeconfig.json).
Updating file (com.foo1.staging\Web.Views.dll).
Updating file (com.foo1.staging\Web.Views.pdb).
Adding database (data source=VMFoo;initial catalog=com.foo1-staging;trusted_connection=True;multipleactiveresultsets=true)
Adding database (sitemanifest/dbFullSql[@path='data source=VMFoo;initial catalog=com.foo1-staging;trusted_connection=True;multipleactiveresultsets=true']/sqlScript)
Publish Succeeded.
Однако, когда я публикую на втором веб-сайте, это не так:
Updating file (com.foo2.staging\web.config).
Updating file (com.foo2.staging\Web.deps.json).
Updating file (com.foo2.staging\Web.runtimeconfig.json).
Publish Succeeded.
Я увеличил уровень ведения журнала для задачи сборки (Инструменты -> Параметры -> Проекты и решения -> Сборка и запуск -> Подробность вывода сборки проекта MSBuild) в VS2017, и я отследил это до следующей строки в решении который не вызывает задачу GenerateEFSQLScripts:
Task "GenerateEFSQLScripts" skipped, due to false condition; ('$(_IsAspNetCoreProject)' == 'true' And '$(IsGenerateEFSQLScriptsDisabled)' != 'true' And @(EfMigrations) != '') was evaluated as ('true' == 'true' And '' != 'true' And != '').
В журнале с рабочего сайта написано:
Using "GenerateEFSQLScripts" task from assembly "C:\Program Files\dotnet\sdk\2.1.301\Sdks\Microsoft.NET.Sdk.Publish\build\netstandard1.0\..\..\tools\net46\Microsoft.NET.Sdk.Publish.Tasks.dll".
Generating Entity framework SQL Scripts...
Похоже, проблема связана с @ (EfMigrations)? Если да, то может ли кто-нибудь пролить свет на то, откуда это взялось, и как я могу обработать миграции в рамках публикации?
Когда я смотрю на файл web.sourcemanifest.xml в папке PubTmp, появляется дополнительная строка:
<dbfullsql path = "D:\Dev\dotnet\Core\foo1\Web\obj\Staging\netcoreapp2.1\win-x64\PubTmp\EFSQLScripts\Data.ApplicationDbContext.sql" />
Конечно, это могло быть чисто потому, что задача GenerateEFSQLScripts не запускалась, но я подумал, что отмечу это, если это поможет кому-то ответить на мой вопрос.
Ваш appsettings.json находится в корне вашего запускаемого проекта? Смотрите мой ответ ниже. Моя проблема заключалась в том, что у меня были файлы настроек приложения в папке конфигурации. Мой запуск был настроен так, чтобы смотреть в папку конфигурации, и приложение работало нормально, однако экран развертывания проекта смотрел только в корень и не отображал раздел структуры сущности, так как не мог найти никаких настроенных строк подключения.
Если ваши настройки приложения находятся в корне проекта, мне интересно, может ли это быть связано с неправильной конфигурацией среды, в которой вы развертываете? То есть appsettings.staging.json не имеет строк подключения или неправильно настроен.
Моя конкретная проблема заключалась в том, что файл appsettings.json находился в папке конфигурации, а не в корне проекта.
Инструменты работают в предположении, что appsettings.json всегда находится в корне.
Одно решение сработало, потому что изначально у меня был appsettings.json в корне, я выполнил публикацию, но позже переместил его в папку конфигурации.
Microsoft собирается добавить возможность настроить это, чтобы инструменты позволяли настраивать местоположение для appsettings.json.
Более подробную информацию об этом можно найти на Git:
Вы нашли решение? У меня тоже такая проблема.