2014-12-31 3 views
4

나는 다음과 같은 한 :단일 컨텍스트

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

:

 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을 사용함으로써 나는 괜찮을 것이라고 생각했다.

+0

나에게 잘 보입니다. 나는 전에 그 오류를 보았다. 그것은 기본적으로 다양한 것을 의미 할 수 있습니다. 이 상황이 발생하면 전체 콜 스택을 게시하십시오. await 키워드 앞에 다음과 같이 입력하십시오.'(var dbCOntext = new DbContext())를 사용하십시오. dbCOntext.Database.Initialize (force : false); ' –

+0

스레드 문제가 아닐 수도 있습니다. 아직 존재하지 않거나 아직 생성 중일 때 새로운 컨텍스트에서 코드를 실행 중일 수 있습니다. – Baddack

+0

db.Things.Add (param); param은 문자열이고 인스턴스 인 경우 잘못 되었기 때문에 잘못되었습니다. 그런 다음 예외를 던지기 시작합니다. 이것은 –

답변

0

나는 바보입니다. 그것은 내가 비동기 메소드 외부에 _numberService을 정의했기 때문에 모든 비동기 사용이 다른 것에 대한 컨텍스트를 덮어 썼기 때문입니다. 도.

관련 문제