美文网首页
.NET Core中使用Entity Framework连接Sq

.NET Core中使用Entity Framework连接Sq

作者: 达哥傻乐 | 来源:发表于2023-12-13 17:10 被阅读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);
    

    相关文章

      网友评论

          本文标题:.NET Core中使用Entity Framework连接Sq

          本文链接:https://www.haomeiwen.com/subject/xiabgdtx.html