实体框架核心和多线程

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 获得一个。

【讨论】:

以上是关于实体框架核心和多线程的主要内容,如果未能解决你的问题,请参考以下文章

实体框架和多线程

iPhone 核心数据和多线程

核心数据和多线程在保存时崩溃

核心数据和多线程

多线程和多进程的区别

多进程和多线程有啥区别?