具有许多线程的单一上下文与实体框架

时间:2014-12-31 18:55:00

标签: c# multithreading entity-framework

我有以下内容:

           await Task.WhenAll(
                 Task.Run(() => HandleJob("one"),
                 Task.Run(() => HandleJob("two"),
                 Task.Run(() => HandleJob("three"));

HandleJob在哪里:

       private async Task HandleJob(string param) {
              using (var db = new DbContext()) {
                     _numberService = new NumberService(db);
                     _numberService.DoThis(param);
              }
       }

NumberService是这样的:

    public class NumberService {

           private readonly DbContext db;

           private CommService _commService;

           public NumberService(DbContext db) {
              this.db = db;
              _commService = new CommService(db);
           }


           public void DoThis(string param){
              _commService.DoThat(param);   
           }

     }

CommService就是这样:

     public class CommService {

           private readonly DbContext db;

           public CommService(DbContext db) {
              this.db = db;
           }

           public void DoThat(string param){
              db.Things.Add(param);
              db.SaveChanges();
           }

     }

我遇到了一个问题,当我尝试运行时会看到以下内容:

  

System.InvalidOperationException类型的异常   发生在EntityFramework.dll但未在用户代码中处理上下文   在创建模型时不能使用。这个例外可能是   如果在OnModelCreating方法中使用上下文或者是否使用了上下文   多个线程访问相同的上下文实例   同时。注意DbContext的实例成员和相关的   类不保证是线程安全的。

我做错了什么?我认为通过为每个线程使用新的dbContext,我会没事的。

1 个答案:

答案 0 :(得分:0)

我是个白痴。这是因为我在异步方法之外定义了_numberService,因此每个异步使用都会覆盖其他的上下文。卫生署。