在.NET Core中,默认是有appsettings.json配置文件的,这样可以在其中指定数据库文件的路径,这里主要演示在原本没有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);
-
通过注入取得配置
改造系统自动实例化的工作的类比如控制器类(MVC程序中)或者Worker类(后台服务中)的构造函数 :
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
里定义的参数就容易了,我们要拿到上面的定义的键DefaultConnection
的值 ,只需要用下面的代码:
var defConn = _configuration.GetConnectionString("DefaultConnection");
- 将取得的连接替换通过
Scaffold-DbContext
命令生成的数据库上下文里面的连接,我这里的名称是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");
将之改成下面的样子,注意这里还添加了一个新的构造函数和私有变量:
private string connString = "";
public WinSecLogContext(string dbFile)
{
connString = dbFile;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(connString);
}
- 使用改造过后的数据库上下文的方法(注意这里引用了上面第四步取得的配置文件中配置的连接字串)
var dbContaxt = new WinSecLogContext(defConn);