1

在线程中的 Entity Framework 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();
        }

更新

我进行了必要的更改来解决该问题。

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

1 回答 1

3

存储库和工作单元应该归您的线程所有,原因有两个:

  • EF 不是线程安全的 - 在线程之间共享上下文可能会导致您错误地认为您可以在同一个上下文实例上执行并发操作,但您通常不能。这在 EF6 中可能会发生变化,其中async将实施支持,但当前版本仅用于单线程处理。
  • 如果您在线程之间共享上下文,则必须确保拥有该上下文的线程不会在依赖于该上下文的任何其他线程完成其处理之前释放该上下文 - 这是您当前的问题。这意味着您的调用线程应该等待您的处理线程完成。
于 2012-08-16T19:00:31.810 回答