动态连接字符串appsettings.json Asp.NetCore



我对API的开发非常陌生,所以我有下一个问题。

是否可以在运行时为我的连接字符串获取数据库名称?这是因为用户将通过Json文件发送DB名称。我正在使用Visual Studio 2019 NetCore 3.1。

我的appsettings.json是这样的:

"ConnectionStrings": {
"ImportConnection": "Data Source=SQLSERVER;Initial Catalog={dbName};User ID=Id;Password=Pass;MultipleActiveResultSets=True"
},

我的Startup.cs在配置服务中有这个

services.AddDbContext<ApplicationDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ImportConnection")));

用户发送带有下一个结构的Json文件

{
"ImportTypeId": 1,
"Data": [
{
"LayoutID": 6,
"ClientID": "XXX",

其中ClientID是数据库名称。

我真的很想知道是否有办法用ClientID值替换connectionString中的Initial Catalog{dbName}。

这也是我的DbContext

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace API_Test.Models
{
public class ApplicationDBContext : IdentityDbContext<ApplicationUser>//DbContext
{
public ApplicationDBContext(DbContextOptions<ApplicationDBContext> options) : base(options)
{
}
public DbSet<DataModel> API_DATA { get; set; }
}
}

非常感谢

您可以将SqlConnectionStringBuilder类与命令行参数结合使用以满足要求。不过,提供的解决方案并不将命令行输入视为json。它希望输入是一个正常的命令行参数。我建议您再次访问它,并检查您的用户是否可以将json转换为参数列表,并将其传递给应用程序

因此,假设用户使用以下参数运行应用程序:

dotnet run --ClientID XXX

Program.cs内部,确保将命令行参数传递到CreateDefaultBuilder()方法中,因为这是一种内部解析所有命令行参数并将其添加到配置对象中的方法。

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});

有了它,您现在可以覆盖startup.cs中的数据库值,如内联所示:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(Configuration.GetConnectionString("ImportConnection"));
if (!string.IsNullOrEmpty(Configuration.GetValue<string>("ClientID")))
{
builder.InitialCatalog = Configuration.GetValue<string>("ClientID");
}
services.AddDbContext<ApplicationDBContext>(options => options.UseSqlServer(builder.ConnectionString));

最新更新