代码之家  ›  专栏  ›  技术社区  ›  Tachyon

在program.cs中访问数据库上下文

  •  0
  • Tachyon  · 技术社区  · 6 年前

    是否有方法访问.NET核心应用程序的数据库上下文 program.cs 文件?我基本上是想配置红隼与特定的选项,存储在数据库中,所以我需要访问数据库上下文。

    我基本上是想做这样的事情:

    WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSentry()
                .UseKestrel(opts =>
                     {
                        opts.Listen(IPAddress.Any, 443, listenOptions =>
                        {
                            var storedCert = _db.Certificates.First(c => c.Id == 1);
                            var certBytes = Convert.FromBase64String(storedCert.CertificatePfx);
                            var certPassword = storedCert.CertificatePassword;
    
                            var cert = new X509Certificate2(certBytes, certPassword);
    
                            listenOptions.UseHttps(cert);
                        });
                    });
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   itminus    6 年前

    诀窍在于如何在单例中创建作用域服务

    
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
    
       public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseKestrel(opt => {
                    var sp = opt.ApplicationServices;
                    using(var scope = sp.CreateScope() ){
                        var dbContext=scope.ServiceProvider.GetService<AppDbContext>();
                        var e= dbContext.Certificates.FirstOrDefault();
                        // now you get the certificates
                    }
                });
        }
    
        2
  •  1
  •   Anton Toshik    6 年前

    尝试执行以下操作:

    var host = CreateWebHostBuilder(args).Build();
    
    var scope = host.Services.CreateScope();
    
    var ctx = scope.ServiceProvider.GetRequiredService<MyDbContext>();       
    
    //get a new WebHostBuilder
    CreateWebHostBuilder(args)
    //Configure here using the ctx
    .Build()
    .Run();
    
        3
  •  0
  •   Ikram Shah    6 年前

    是的,您可以使用以下代码获得服务

     var host = BuildWebHost(args);
    
    DbContext context = host.Services.GetService<DbContext>();
    

    以及注册您的 数据库上下文 在里面 启动.cs 如下所示

    services.AddDbContext<DbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    
        4
  •  0
  •   Tachyon    6 年前

    我知道怎么做了。您需要手动构建数据库上下文的配置,然后实例化上下文,然后才能使用它。这是密码,以防有人在这个位置。

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .UseSentry()
                    .UseKestrel(opts =>
                    {
                        opts.Listen(IPAddress.Any, 443, listenOpts =>
                        {
                            //Create the configuration to read from appsettings.json
                            var configuration = new ConfigurationBuilder().AddJsonFile(
                                    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appsettings.json"))
                                .Build();
    
                            //Create the DB Context options
                            var optionsBuilder = new DbContextOptionsBuilder<DBContext>()
                                .UseSqlServer(configuration["ConnectionString:Development"]);
    
                            //Create a new database context
                            var context = new DBContext(optionsBuilder.Options);
    
                            //Get the certificate
                            var certificate = context.Certificates.First();
                        });
                    });