2012-01-28 1 views
1

EFでかなり新しいです...現在、EFでasp.netのWebサイトを開発していますが、接続に関する例外が発生します。例外エンティティフレームワークを使用しているときに接続の現在の状態が破損しています

私は私がプログラムされてきた。これによると、この記事http://cgeers.com/2009/02/21/entity-framework-objectcontext/を読んだ:

public static class ObjectContextPerHttpRequest 
{ 
    public static tradeEntities Context 
    { 
     get 
     { 
      string objectContextKey = HttpContext.Current.GetHashCode().ToString("x"); 
      if (!HttpContext.Current.Items.Contains(objectContextKey)) 
      { 
       HttpContext.Current.Items.Add(objectContextKey, new tradeEntities()); 
      } 
      return HttpContext.Current.Items[objectContextKey] as tradeEntities; 
     } 
    } 
} 

をして、私がために...どこか私のウェブサイト上で、私は製品を取得する必要がmyEntities et = p.ObjectContextPerHttpRequest.Context;

を使用これを行うには、私はこれを使用します:

public List<tProducts> returnProductsFromSubcategory(int subcategoryID) 
    { 
     var prod = from p in et.tProducts 
        from c in et.tCompany 
        where (c.companyID == p.fk_companyID && c.enable == true) 
        where (p.subCategoryID == subcategoryID && p.enable == true) 
        select p; 

     //et.Connection.Close(); 

     return prod.ToList(); //Here comes an Exception The connection's current state is broken. 
    } 

時にはうまくいくことがありますが、時には例外が発生することがあります。

System.InvalidOperationExceptionコマンドの実行には、開いて利用可能な接続 が必要です。接続の現在の状態は です。

私は何が間違っているのかよくわかりません。私はdispose関数を実装すべきだと読んだが、どこに追加するのか、どうすればいいのだろうか?

ご協力いただきありがとうございます。

マーティン

+1

ObjectContextは、データベースにもうクエリする必要がなくなったときに使用した各要求処理で処理する必要があります。これが、静的コンテキストアクセサーを使ったこのアプローチがあまり有用ではない理由です。 –

+0

OK、処分方法は?どういうわけかダイナミックにできますか? –

+0

Ups ...私の質問は忘れてしまったようです...私はどのようなヒントに対しても、私はどのように処分行動をプログラムすることができますか非常に感謝しています。ありがとう。 –

答えて

1

あなたはusing文でクエリをラップする必要があるオブジェクトコンテキストを処分します。

public List<tProducts> returnProductsFromSubcategory(int subcategoryID) 
{ 
    using(var et = new tradeEntities()) 
    { 
     var prod = from p in et.tProducts 
        from c in et.tCompany 
        where (c.companyID == p.fk_companyID && c.enable == true) 
        where (p.subCategoryID == subcategoryID && p.enable == true) 
        select p; 
     return prod.ToList(); 
    }  
} 

これにより、自動的にオブジェクトコンテキストが破棄され、データベースへの接続が適切に閉じられ、接続プールに戻ることができます。 usingブロック内のすべてのクエリをラップすることをお勧めします。

0

あなたはあなたの文脈を破棄しなければなりません。 'using'演算子を使うか、 'Dispose'メソッドを呼び出すことができます。
Here問題はより詳細な方法で議論されます。

関連する問題