1

在线程中的实体框架4.3中运行查询时,出现以下错误。实体框架4.3和线程

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. 

下面是我的线程开始,它在var item = _gamesRepository.Get(gameIncludes, q => q.Id == gameId);错误。我做错了什么,或者我应该用不同的方法?

public void ProcessGame(int gameId) 
     { 
      new Thread(() => 
      { 
       Expression<Func<Game, object>>[] gameIncludes = { 
                   q => q.DivisionGameTeamResults, 
                   q => q.DivisionGameTeamResults.Select(g => g.DivisionBracketGameParticipant), 
                   q => q.DivisionGameTeamResults.Select(g => g.DivisionTeamPoolGame), 
                   q => q.DivisionGameTeamResults.Select(g => g.DivisionTeamPoolGame.DivisionTeamPool), 
                   e => e.DivisionGameTeamResults.Select(q => q.DivisionBracketGameParticipant.DivisionBracketGame.DivisionBracketGameParticipants.Select(t => t.DivisionBracketGameParticipantTeam.DivisionTeam.Team)), 
                   e => e.DivisionGameTeamResults.Select(q => q.DivisionBracketGameParticipant.DivisionBracketGame.DivisionLoserBracketGameParticipants.Select(d => d.DivisionBracketGameParticipantPool.DivisionPool)), 
                   e => e.DivisionGameTeamResults.Select(q => q.DivisionBracketGameParticipant.DivisionBracketGame.DivisionLoserBracketGameParticipants.Select(d => d.DivisionBracketGameParticipantTeamPool.DivisionTeamPool.DivisionTeam)), 
                   q => q.DivisionGameTeamResults.Select(d => d.DivisionTeamPoolGame.DivisionTeamPool.DivisionPool.Division.Event.Members), 
                   q => q.DivisionGameTeamResults.Select(d => d.DivisionBracketGameParticipant.DivisionBracketGame.BracketPart.DivisionBracketPart.DivisionBracket.Division.Event.Members) 
                  }; 
       var item = _gamesRepository.Get(gameIncludes, q => q.Id == gameId); 

       if (item != null) 
       { 
        if (item.DivisionGameTeamResults.All(d => d.DivisionTeamPoolGame != null)) 
        { 
         // Pool Game 
         _divisionBracketsService.ProcessPoolGame(item); 
        } 
        else if (item.DivisionGameTeamResults.All(d => d.DivisionBracketGameParticipant != null)) 
        { 
         // Bracket Game 
         _divisionBracketsService.ProcessBracketGame(item); 
        } 

        UnitOfWork.Commit(); 
       } 

      }).Start(); 
     } 

UPDATE

我做了必要的修改,以解决这个问题。工作

var gamesRepository = DependencyResolver.Current.GetService<IGamesRepository>(); 
var divisionBracketsService = DependencyResolver.Current.GetService<IDivisionBracketsService>(); 

回答

3

库和单位应该由你的线程有两个原因所拥有:

  • EF不是线程安全 - 线程间共享方面会导致你错误的信念,你可以做并行操作在相同的上下文实例中,但一般情况下不能。这可能会在EF6中发生变化,其中async支持将被实现,但当前版本仅用于单线程处理。
  • 如果您在线程之间共享上下文,您必须确保拥有该上下文的线程在任何其他依赖该上下文的线程完成其处理之前不会处理该上下文 - 这是您当前的问题。这意味着你的调用线程应该等待你的处理线程完成。