[英]Why does 'await' change the thread context in WinForms program.cs
[英]Access DB Context in program.cs
有没有办法在program.cs
文件中访问 .NET 核心应用程序的数据库上下文? 我基本上希望使用存储在数据库中的特定选项来配置 Kestrel,因此我需要访问数据库上下文。
我基本上是想做这样的事情:
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);
});
});
诀窍在于如何在单例中创建作用域服务:
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
}
});
}
尝试执行以下操作:
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();
那么下面的代码对我有用 .net 6
using (var scope = app.Services.CreateScope())
{
var service = scope.ServiceProvider;
var context = service.GetService<MyAppDbContext>();
}
使用它,您不仅可以使用 get dbcontext,还可以使用任何其他服务。 考虑以下身份为 class 的用户经理 object 的示例:
var userManager = services.GetRequiredService<UserManager<ApplicationUser>>();
是的,您可以使用以下代码获得服务
var host = BuildWebHost(args);
DbContext context = host.Services.GetService<DbContext>();
在startup.cs中注册DbContext的代码如下
services.AddDbContext<DbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
我想出了如何去做这件事。 您需要手动构建数据库上下文的配置,然后实例化上下文,然后您就可以使用它了。 这是代码,以防有人处于此位置。
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();
});
});
对于构建 deb 上下文和program.cs
:
builder.Services.AddDbContext<StudentDbContext>(option =>
option.UseSqlServer(builder.Configuration.GetConnectionString("DBCS")));
[1] 连接字符串 -
a) "ConnectionStrings": { "DB": "Server=SQL Server Name; Database=Name Of Database; Trusted_Connection=True;Trust Server Certificate=true" }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.