在.NET Core中吗氏,默認是有appsettings.json配置文件的芽偏,這樣可以在其中指定數(shù)據庫文件的路徑,這里主要演示在原本沒有appsettings.json文件的情況下牲证,如何添加這個配置文件并讀取其配置哮针。
-
給項目添加一個appsettings.json文件,并將其復制屬性設置為永遠復制或者較新則復制坦袍。
- 在appsettings.json中填寫連接字符串的內容,這里我把鍵名使用默認的
DefaultConnection
等太,這可以根據需要改成別的比如WinSecLogDbConnection
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=D:\\Temp\\WinSecLog.db"
}
}
- 在Program.cs入口中加載配置文件并配置注入服務
// 加載 appsettings.json 文件
var configuration = new ConfigurationBuilder()
// .SetBasePath(System.IO.Directory.GetCurrentDirectory())
.SetBasePath(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build();
// 將配置注入到服務中
builder.Services.AddSingleton<IConfiguration>(configuration);
-
通過注入取得配置
改造系統(tǒng)自動實例化的工作的類比如控制器類(MVC程序中)或者Worker類(后臺服務中)的構造函數(shù) :
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IHostApplicationLifetime _appLifetime;
private readonly IConfiguration _configuration;
public Worker(ILogger<Worker> logger, IHostApplicationLifetime appLifetime, IConfiguration configuration)
{
_logger = logger;
_appLifetime = appLifetime;
_configuration = configuration;
}
拿到上面的變量_configuration
后,需要拿到appsettings.json
里定義的參數(shù)就容易了缩抡,我們要拿到上面的定義的鍵DefaultConnection
的值 奠宜,只需要用下面的代碼:
var defConn = _configuration.GetConnectionString("DefaultConnection");
- 將取得的連接替換通過
Scaffold-DbContext
命令生成的數(shù)據庫上下文里面的連接,我這里的名稱是WinSecLogContext
瞻想,打開WinSecLogContext.cs压真,找到protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
原始方法如下:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
=> optionsBuilder.UseSqlite("Data Source=.\\WinSecLog.db");
將之改成下面的樣子,注意這里還添加了一個新的構造函數(shù)和私有變量:
private string connString = "";
public WinSecLogContext(string dbFile)
{
connString = dbFile;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(connString);
}
- 使用改造過后的數(shù)據庫上下文的方法(注意這里引用了上面第四步取得的配置文件中配置的連接字串)
var dbContaxt = new WinSecLogContext(defConn);