.NET Core中使用Entity Framework连接Sq

2023-12-13  本文已影响0人  达哥傻乐

在.NET Core中,默认是有appsettings.json配置文件的,这样可以在其中指定数据库文件的路径,这里主要演示在原本没有appsettings.json文件的情况下,如何添加这个配置文件并读取其配置。

  1. 给项目添加一个appsettings.json文件,并将其复制属性设置为永远复制或者较新则复制。


    图1. 增加一个appsettings.json配置文件
  2. 在appsettings.json中填写连接字符串的内容,这里我把键名使用默认的DefaultConnection,这可以根据需要改成别的比如WinSecLogDbConnection
    图2. 内容示例
{

  "ConnectionStrings": {
    "DefaultConnection": "Data Source=D:\\Temp\\WinSecLog.db"
  }
}
  1. 在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);
  1. 通过注入取得配置
    改造系统自动实例化的工作的类比如控制器类(MVC程序中)或者Worker类(后台服务中)的构造函数 :


    图3. 改造工作的类的实例效果,红框中内容为新增
    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");
  1. 将取得的连接替换通过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);
   }
  1. 使用改造过后的数据库上下文的方法(注意这里引用了上面第四步取得的配置文件中配置的连接字串)
var dbContaxt = new WinSecLogContext(defConn);
上一篇下一篇

猜你喜欢

热点阅读