1

Je reçois l'erreur ci-dessous lors de l'exécution d'une requête dans Entity Framework 4.3 dans un thread.Entity Framework 4.3 et Threading

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

Ci-dessous est où mon fil commence et il erreurs à var item = _gamesRepository.Get(gameIncludes, q => q.Id == gameId);. Est-ce que je fais quelque chose de mal ou devrais-je utiliser une approche différente?

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(); 
     } 

MISE À JOUR:

J'ai fait les changements nécessaires pour résoudre ce problème.

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

Répondre

3

dépôt et l'unité de travail devraient appartenir à votre fil pour deux raisons:

  • EF est pas thread-safe - contexte de partage entre les threads peut vous conduire à une fausse croyance que vous pouvez effectuer des opérations simultanées sur la même instance de contexte, mais vous ne pouvez pas en général. Cela peut changer dans EF6 où le support async sera implémenté mais la version actuelle est seulement pour le traitement à un seul thread.
  • Si vous partagez un contexte entre des threads, vous devez vous assurer que le thread propriétaire du contexte ne dispose pas du contexte avant que tout autre thread dépendant de ce contexte ne termine son traitement - c'est votre problème actuel. Cela signifie que votre thread appelant doit attendre la fin de votre thread de traitement.