实体框架核心和多线程

时间:2016-05-03 20:24:31

标签: c# asp.net multithreading entity-framework asp.net-core

在我的ASP.NET核心应用程序中,我有一些复杂的业务逻辑,涉及多个线程在HTTP请求范围之外进行数据库操作。从处理请求的同一线程访问数据库是微不足道的,但是当产生需要自己的DbContext的线程时,这变得乏味。由于DbContext本身不是线程安全的,除了从IServiceProvider获取DbContext之外,我还尝试创建一个新的DbContext及其选项。使用这两种方法,我得到以下异常:

  

尝试在配置上下文时使用上下文。一个   DbContext实例不能在OnConfiguring中使用,因为它是   此时仍在配置中。

我的印象是我以错误的方式处理这个问题而且我不应该像这样处理数据库连接。那么我怎么能在与处理传入请求的线程分开的线程中获取DbContext?

2 个答案:

答案 0 :(得分:0)

我测试了它的确有效:

var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
                            optionsBuilder.UseSqlServer(DbConnectionString);

                            using (var context = new ApplicationDbContext(optionsBuilder.Options))
                            {

                                //save or update() on *context* here
                            }

答案 1 :(得分:-1)

事实证明我的测试代码有一个小错字,使得它在所有线程中使用相同的DbContext。但是,我需要创建一个新的DbContext实例,但我无法通过我的问题中提到的IServiceProvider获取它。