ちょっと最近、拡張メソッドの使い方を学び、現在のプロジェクトでそれを実装することに非常に興奮しています。静的クラスでdbcontextを使用するには? (ObjectDisposedException)
私の目標: 私はリンクが私のナビゲーションバーに表示するためにどのナビゲーションを決定することができるように複数のコントローラでそれを使用するつもりですので、私は、エントリはヘルパークラスで私のテーブルに存在するかどうかを確認したいです:
私の問題: 私は私の静的ヘルパークラスで私のdbcontextにアクセスする方法を知りません。私のdbcontextコントローラは、静的クラスを渡す方法を知らない引数をとります。私は新しいdbcontextを作成すると、以下で説明したスコープの問題を解決できると思いますが、私はオプションの引数をコンストラクタに渡すことはできません。
現在では、Startup.csクラスで構成されています。引数としてApplicationDbContextを渡す :私が試した何
。これは私のコントローラの単一のメソッド呼び出しで機能しますが、複数の拡張メソッドを呼び出すとき(ユーザーが持つゲームアカウントを調べるために)、ObjectDisposedExceptionが発生します。
ObjectDisposedException:破棄されたオブジェクトにアクセスできません。このエラーの一般的な原因は、依存性注入から解決されたコンテキストを破棄し、後でアプリケーションの別の場所で同じコンテキストインスタンスを使用しようとすることです。これは、コンテキストでDispose()を呼び出す場合、またはusingステートメントでコンテキストをラップする場合に発生する可能性があります。依存性注入を使用している場合は、依存性注入コンテナがコンテキストインスタンスを処理するようにする必要があります。 オブジェクト名: 'ApplicationDbContext'。
私が理解しているところでは、最初のメソッド呼び出しが完了したときにコンテキストを破棄し、次の呼び出しで同じコンテキストを使用しようとしているスコープの問題です。その問題を回避するために私は何ができますか?
私はこのリンクCannot access a disposed object in ASP.NET Core when injecting DbContextを読んでみましたが、それはStartup.csクラスにあるApplicationBuilderを必要とするため、私には役に立たなかった。
ソリューションのアップデート 私は変数にそれを置くので、私はすべてのメソッド呼び出しの後dbcontextに配置されました。拡張子があなたを意味するものではありません、あなたに新しい、光沢があるものの、
おかげでデビッドとサイモンは
をあなたは* '* HasDota2Account()'を呼び出す方法は?あなたは 'DbContext'をそれに渡していますか? '_context'はどこから来たのですか?このエラーは、実際には 'UpdateNavLinks()'を呼び出す前に処理されたことを示しているようです。だからあなたはそれを処分すべきではないか、またはそのメソッドでローカルにインスタンス化されたコンテキストを使用しているはずです。データコンテキストオブジェクトを*共有しようとすると、この問題が発生することがよくあります。 – David
また、HasDota2Accountでは、dbはコンテキストと同じオブジェクトです。 dbが破棄されたときにはコンテキストも同じになります。 HasDota2Accountの呼び出しの後でコンテキストを使用しようとすると、同じ例外が発生します。 –
私は最初のイメージのようにコントローラから呼び出しています。 _context_は私のコントローラ上のフィールドで、コンストラクタでインスタンス化されています。私はそれが処分されているかわからない。私はローカルの_dbcontextをインスタンス化する方法を理解しているとは思えない_なぜなら、_of startup.cs_の外で渡すことができないオプション引数をとるからです。 –