1

さて、質問はほとんどそれをすべて言います、しかし私はあなたに文脈を与えることを試みます。私はEntityFramework4.0を使用していますが、次の構文を頻繁に使用しています-

using (MLEntities context = ModelAccess.GetContext())
{
    /*just a sample statement*/
    this.ClientList = context.Clients.ToList();
    ...
    //Some other code
}  

私の理解では、usingブロックを終了するたびDispose()に、ObjectContextクラス(MLEntitiesの基本クラス)のメソッドが呼び出されます。これにより、管理されていないリソース、特にこの場合はデータベース接続が解放されると思います。しかし、コンテキストを介しthis.ClientList = context.Clients.ToList();てコンテキストオブジェクトへの参照を保持しているため、ガベージコレクションは行われません。右?

インスタンス化されたコンテキストオブジェクトの中には、アプリケーションの実行中に、それらがまだ保持されているのか、アプリケーションによって使用されているのか、リリースされているのかを知る必要があります。ブロック外のコンテキストの参照はありませんが、参照があるusing場合でも、その参照を使用しようとすると、アプリケーションで使用されているコンテキストオブジェクトが作成されます。では、どうすればそれができますか?任意の提案をいただければ幸いです。ありがとう。

編集:実際、私はコンテキストオブジェクトへの直接参照を保持していると言うつもりはありませんでした。正直な間違い。私が意味したのはClients、コンテキストのプロパティであり、コンテキストをインスタンス化する現在のオブジェクトが存在する限り、this.ClientListへの参照を保持しているため、コンテキストオブジェクトも存続しませんか?Clientsthis.ClientList

4

1 に答える 1

2

using() {}使用中のオブジェクトを常に破棄します。ClientList を介してコンテキストへの参照を保持しません。リストへの簡単な参照です。破棄された後にコンテキストを参照していても、それにアクセスするとObjectDisposedException例外が発生します。
コンテキストが破棄されると、ClientList はコンテキストから切り離されるため、EF はこのリストの変更を追跡しなくなります。

于 2012-09-04T17:03:58.023 に答える