[英]I am having trouble in using User Secrets with Azure SDK WebJobs in a console application using Net Core 3.1
[英]How to manage user secrets in .NET Core Console Application for EF Scaffolding?
我正在使用 VS 2019 制作 .NET 核心控制台應用程序。我使用 EF 腳手架使用 de NuGet 控制台。 在 MVC 項目中,我使用以下命令:
Scaffold-DbContext Name=ConnectionStrings:ClientConnection....
請注意,我使用 appesetting.json 中存在的別名,因此我不會將數據庫憑據顯式放入命令中(出於良好實踐目的)。 無論如何,正如我所說,這在 MVC 項目中有效,但在控制台應用程序中它不接受別名,我收到以下錯誤:
“使用了命名連接字符串,但在應用程序的配置中找不到名稱‘ConnectionStrings:ClientConnection’。請注意,僅在使用‘IConfiguration’和服務提供程序時才支持命名連接字符串,例如在典型的 ASP.NET 核心應用程序中. 有關詳細信息,請參閱https://go.microsoft.com/fwlink/?linkid=850912 。”
我必須明確地將連接字符串添加到所有內容中才能正常工作。
如何在 .NET 核心控制台應用程序中使用“Name=ConnectionStrings:ClientConnection”沒有任何問題的腳手架命令?
如果您的控制台應用程序使用通用主機,它會變得容易得多。 腳手架的最小代碼如下。
public class Program
{
public static async Task Main()
{
var builder = Host.CreateDefaultBuilder();
builder.ConfigureHostConfiguration(icb =>
{
icb.AddUserSecrets<Program>();
});
await builder.Build().RunAsync();
}
}
您的secret.json
包含連接字符串,例如:
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=EFCoreConsoleDb;Integrated Security=true;TrustServerCertificate=true"
}
}
假設您的項目名稱是EFCoreConsole
並且活動目錄是解決方案目錄,請執行以下批處理來搭建腳手架。
REM A batch file to scaffold!
dotnet ef dbcontext scaffold ^
name=DefaultConnection ^
Microsoft.EntityFrameworkcore.SqlServer ^
-s EFCoreConsole ^
--force ^
--context AppDbContext ^
--context-dir "Contexts" ^
--context-namespace EFCoreConsole.Contexts ^
--output-dir "Entities" ^
--namespace EFCoreConsole.Entities ^
--no-onconfiguring
如果你想在同一個項目中使用生成的上下文和實體,這里是代碼。
public class Application : IHostedService
{
private readonly AppDbContext context;
public Application(AppDbContext context)
{
this.context = context;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
foreach (var p in await context.Products.ToArrayAsync())
Console.WriteLine($"{p.Id}, {p.Description}");
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
public class Program
{
public static async Task Main()
{
var builder = Host.CreateDefaultBuilder();
builder.ConfigureHostConfiguration(icb =>
{
icb.AddUserSecrets<Program>();
});
builder.ConfigureServices((hbc, isc) =>
{
isc.AddDbContext<AppDbContext>(dcob =>
{
var constr = hbc.Configuration.GetConnectionString("DefaultConnection");
//var constr = "DefaultConnection";
dcob.UseSqlServer(constr);
}, ServiceLifetime.Singleton);
isc.AddHostedService<Application>();
});
await builder.Build().RunAsync();
}
}
希望它對下一代有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.