【问题标题】:ASP.NET Core how to init connection string in first run-time?ASP.NET Core 如何在第一次运行时初始化连接字符串?
【发布时间】:2018-07-06 14:41:50
【问题描述】:

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

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

什么建议有办法做到这一点?

【问题讨论】:

  • 为什么需要在运行时更改配置值?
  • 我希望用户选择配置,然后在接下来的运行中照常加载配置
  • 我想运行一个页面供用户选择服务器地址和数据库,然后将其保存在配置中并运行实际网站
  • 这里这种方法称为代码优先方法。首先您必须在appsettings.json 中创建连接字符串。然后创建ApplicationDbContext ,最后在Startup.cs 文件中使用SQL Server 配置对其进行配置。请按照以下步骤操作。

标签: asp.net-core connection-string


【解决方案1】:

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 class HomeController : Controller  
{
    private readonly ConnectionString _connectionString;

    public HomeController(IOptionsSnapshot<ConnectionString> connectionString)
    {
        _connectionString = connectionString.Value;
    }
}

IOptionsSnapshot 可以在配置数据发生变化时重新加载。

关于Configuration的更多信息。

【讨论】:

    【解决方案2】:

    您必须在 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();
    } 
    

    【讨论】:

    • 如何在不连接数据库的情况下运行应用程序,在选择配置后我想将其保存在配置中
    【解决方案3】:

    在连接到 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; }
    }
    

    Book 是我应用中的模型。

    最后在Startup.cs 文件中的ConfigureServices方法中配置SQL Server配置。

     public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(option => option.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            services.AddRazorPages().AddRazorRuntimeCompilation();
        }
    

    DefaultConnection 是appsettings.json 中已经提到的连接名称

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 2019-05-07
      • 2020-02-20
      • 2023-03-29
      • 2017-06-21
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 2020-08-05
      相关资源
      最近更新 更多