为每个HTTP请求创建新的DbContext实例
在ASP.NET Core应用程序的Startup.cs文件中,添加以下代码:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyConnectionString")));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, MyDbContext dbContext)
{
app.Use(async (context, next) =>
{
using (var scope = app.ApplicationServices.CreateScope())
{
var db = scope.ServiceProvider.GetService();
context.Items["DbContext"] = db;
await next();
}
});
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
这里,我们将DbContext注册到DI容器中,并在中间件的Use方法中创建每个HTTP请求的作用域,然后从作用域中获取DbContext实例并将其存储在HttpContext.Items集合中,以便在请求处理程序中使用。最后,我们在Configure方法的结尾配置应用程序终结点。
现在,在您的控制器或任何其他请求处理程序中,您可以通过获取HttpContext中的DbContext来访问数据库:
public class MyController : Controller
{
private readonly MyDbContext _dbContext;
public MyController(IHttpContextAccessor accessor)
{
_dbContext = (MyDbContext)accessor.HttpContext.Items["DbContext"];
}
public IActionResult Index()
{
var data = _dbContext.MyEntities.ToList();
return View(data);
}
}
通过这种方式,您为每个请求创建了一个新的DbContext实例,避免了多线程问题。