Asp.net core NET内核如何在第一次运行时初始化连接字符串?

Asp.net core NET内核如何在第一次运行时初始化连接字符串?,asp.net-core,connection-string,Asp.net Core,Connection String,我正在构建一个企业应用程序,我第一次希望使用run网站能够选择要连接的SQL server以及该服务器中的数据库。在这之后,应用程序总是像普通的asp.net核心应用程序一样在这些配置上运行 我知道连接字符串存储在appsettings.json中,所以在选择此配置后,我考虑在运行时更改它的值,但在搜索了很多之后,我认为这是不可能的 有什么方法可以做到这一点吗?您必须在Program.cs中加载appsettings.json文件 public static void Main(string[]

我正在构建一个企业应用程序,我第一次希望使用run网站能够选择要连接的SQL server以及该服务器中的数据库。在这之后,应用程序总是像普通的asp.net核心应用程序一样在这些配置上运行

我知道连接字符串存储在
appsettings.json
中,所以在选择此配置后,我考虑在运行时更改它的值,但在搜索了很多之后,我认为这是不可能的


有什么方法可以做到这一点吗?

您必须在Program.cs中加载appsettings.json文件

public static void Main(string[] args)
{
    IConfigurationRoot configuration = new ConfigurationBuilder()
      .AddJsonFile("appsettings.json", optional: false) 
      .Build();

    string conStr = configuration.GetConnectionString("DefaultConnection");

    // your code


    var host = WebHost.CreateDefaultBuilder();

    host.Run();
} 

appsettings.json
添加到
ConfigurationBuilder
时,将
reloadOnChange
设置为true:

var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    .AddEnvironmentVariables();
然后为连接字符串创建一个类

public class ConnectionString
{
    public string Default {get; set;}
}
ConfigureServices
方法中:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.Configure<ConnectionString>(Configuration.GetSection("ConnectionStrings"));
}
public void配置服务(IServiceCollection服务)
{
// ...
Configure(Configuration.GetSection(“connectionString”);
}
现在可以通过依赖项注入使用此配置

public class HomeController : Controller  
{
    private readonly ConnectionString _connectionString;

    public HomeController(IOptionsSnapshot<ConnectionString> connectionString)
    {
        _connectionString = connectionString.Value;
    }
}
公共类HomeController:控制器
{
私有只读连接字符串\u连接字符串;
公共家庭控制器(IOptionsSnapshot连接字符串)
{
_connectionString=connectionString.Value;
}
}
IOptionsSnapshot
可以在配置数据更改时重新加载配置数据


有关的详细信息。

在连接到SQL Server Db之前,请确保已安装以下NuGet软件包

首先,您必须在
appsettings.json中创建连接字符串,如下所示

"ConnectionStrings": {
"DefaultConnection": "Server=DESKTOP-O57GSNN\\MSSQLSERVERNEW,Database=BookListRazor;Trusted_Connection=True;MultipleActiveResultSets=True"},
这里,DefaultConnection是您将要使用的连接名称。请提供您想要的任何有意义的名称,并在配置时使用。另外,请提供SQL Server Management Studio中的服务器名称(请参见下图),并提供数据库的名称(将创建)

然后创建
ApplicationDbContext.cs
文件并在下面键入代码

 public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
            
    }

    public DbSet<Book> Book { get; set; }
}
DefaultConnection是已在
appsettings.json


为什么您需要在运行时更改配置值?我希望用户选择配置,并在下一次运行中以通常方式加载的配置。我希望运行一个页面,让用户选择服务器地址和数据库,然后将其保存在配置中并运行实际的网站。这种方法称为代码优先方法。首先,您必须创建连接
appsettings.json
中的字符串。然后创建
ApplicationDbContext
,最后在
Startup.cs
文件中使用SQL Server配置对其进行配置。按照下面给出的步骤操作。如何在不连接DB的情况下运行应用程序,并在选择config后将其保存在config中
 public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(option => option.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddRazorPages().AddRazorRuntimeCompilation();
    }