实体框架核心和多线程
Posted
技术标签:
【中文标题】实体框架核心和多线程【英文标题】:Entity Framework Core and multithreading 【发布时间】:2016-08-29 01:31:38 【问题描述】:在我的 ASP.NET Core 应用程序中,我有一些复杂的业务逻辑,涉及多个线程执行 HTTP 请求范围之外的数据库操作。从处理请求的同一个线程访问数据库是微不足道的,但是当产生需要自己的 DbContext 的线程时,这变得乏味。由于 DbContext 本身不是线程安全的,因此除了从 IServiceProvider 获取 DbContext 之外,我还尝试创建一个新的 DbContext 及其选项。使用这两种方法,我都会遇到以下异常:
在配置时尝试使用上下文。一种 DbContext 实例不能在 OnConfiguring 内部使用,因为它是 此时仍在配置中。
我的印象是我以错误的方式处理这个问题,而且我不应该像这样处理数据库连接。那么我应该如何从处理传入请求的线程中获取一个单独的线程中的 DbContext?
【问题讨论】:
在您使用的每个线程中创建一个新的 DbContext 实例。 DbContext 不是线程安全的。 能否提供一段代码? 【参考方案1】:我测试过,它可以工作:
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(DbConnectionString);
using (var context = new ApplicationDbContext(optionsBuilder.Options))
//save or update() on *context* here
【讨论】:
【参考方案2】:结果我的测试代码有一个小错字,使它在所有线程中使用相同的 DbContext。但是,我需要创建一个新的 DbContext 实例,但我无法通过问题中提到的 IServiceProvider 获得一个。
【讨论】:
以上是关于实体框架核心和多线程的主要内容,如果未能解决你的问题,请参考以下文章