Как использовать Scaffold-DbContext с секретами в EF.Core?
Создал проект типа Class Library (.Net Core), подключил библиотеки для работы с EF.Core с моей СУБД (совместимая версия Microsoft.EntityFrameworkCore.Tools 2.2.6)
В cmd выполнил
cd myProjectPath
dotnet user-secrets init
dotnet user-secrets set ConnectionStrings.MyDb "User Id=MyDbUser;Password=MyDbUserPass;Data Source=MyDbHost:99999/instancename;"
Обе команды выполнены успешно
Затем пытаюсь выполнить в cmd
dotnet ef dbcontext scaffold Name=ConnectionStrings.MyDb ...
Или в PMC
Scaffold-DbContext Name=ConnectionStrings.MyDb ...
A named connection string was used, but the name 'ConnectionStrings.MyDb' was not found in the application's configuration. Note that named connection strings are only supported when using 'IConfiguration' and a service provider, such as in a typical ASP.NET Core application. See https://go.microsoft.com/fwlink/?linkid=850912 for more information.
Если просто в PMC
Scaffold-DbContext "User Id=MyDbUser;Password=MyDbUserPass;Data Source=MyDbHost:99999/instancename;" ...
,то всё работает нормально контекст и модели создаются
Ответы (1 шт):
Проблема не в использовании менеджера секретов. Секрет, это просто одно из средств создать именованную строку подключения --- named connections string.
Для того, чтобы использовать named connections string проект должен обладать конфигурацией. О чём и написано в тексте исключения. Чтобы обладать конфигурацией, мало сохранить файлы .json (будь-то secrets.json или appsettings.json или ВашеНазваниеКонФигурации.json), нужно включить их как используемые для конфигурации.
Так как, Class Library не имеет входной точки, то и не имеет возможности включить их в конфигурацию. А вот именно с секретом может проблем и нет, но так просто его использовать в Class Library не получится.
Чтобы, использовать Scaffold c named connections string (неважно, где она будет храниться в секретах или нет), понадобиться добавить в решение запускаемый проект, который может поддерживать конфигурацию, например, Web Application. Хранить конфигурацию и если надо секреты, то же надо будет в нём. Не забудьте подключить конфигурацию в Startup.cs.
Естественно, при Scaffold-e модели и контекст создадутся тоже в нём. А что если вам хотелось бы, чтобы они создались в Class Library? Оставьте запускаемым проектом проект с конфигурацией. А в интерфейсе PCM выберите, как Default Project --- вашу библиотеку классов. И потом выполните Scaffold. Через dotnet ef я не проверял, но думаю должно быть достаточно перейти в каталог библиотеки, и выполнить команду из него.