1

スレッドのEntityFramework4.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

リポジトリと作業単位は、次の2つの理由でスレッドが所有する必要があります。

  • EFはスレッドセーフではありません。スレッド間でコンテキストを共有すると、同じコンテキストインスタンスで同時操作を実行できるが、一般的には実行できないという誤った考えにつながる可能性があります。これは、サポートが実装されるEF6で変更される可能性がasyncありますが、現在のバージョンはシングルスレッド処理専用です。
  • スレッド間でコンテキストを共有する場合は、コンテキストを所有するスレッドが、そのコンテキストに依存する他のスレッドが処理を終了する前にコンテキストを破棄しないようにする必要があります。これが現在の問題です。これは、呼び出しスレッドが処理スレッドの完了を待機する必要があることを意味します。
于 2012-08-16T19:00:31.810 に答える