2012-01-28 51 views
1

對於EF來說,我很新...目前我正在使用EF開發asp.net中的網站,並且有時會出現有關連接的異常。異常當使用實體框架時,連接的當前狀態被破壞

我讀過這篇文章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該命令的執行需要一個 開放和可用的連接。該連接的當前狀態爲 損壞。

我不知道什麼是錯的。我讀過我應該實現處理功能,但在哪裏添加它,我該怎麼做?

非常感謝您的幫助。

馬丁

+1

在您不需要查詢數據庫時,您必須在每次使用它的請求處理中處置ObjectContext。這是使用靜態上下文訪問器的方法並不十分有用的原因。 – 2012-01-28 11:53:19

+0

好的,以及如何處置?我能做些什麼動態的嗎? – 2012-01-28 19:16:05

+0

Ups ...似乎我的問題已被遺忘......我將非常感謝任何提示,我如何編程處置行動。謝謝。 – 2012-01-31 19:13:00

回答

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

你必須處理你的上下文。您可以使用「使用」運算符,也可以調用「Dispose」方法。
Here該問題以更詳細的方式進行討論。

相關問題