簡體   English   中英

如何在 EF 腳手架的 .NET 核心控制台應用程序中管理用戶機密?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM