2015-06-09 62 views
0

例如代碼:ObjectContext的設置,不能再使用

private static list; 
public void SetList() 
{ 
var query = Container.Advices.Where(); 
list= query.ToList(); 
} 

public void doStuff() 
{ 
var temp= list.where (...).ToList(); 
} 

問題的情況:

當我打電話首次SETLIST,所有工作得很好。 現在,第二個是調用SetList。我可以看到在該方法中,有所有的對象,但在第二個方法doStuff是一個異常拋出:ObjectContext被處置... 我不明白爲什麼。我看到數據在列表中正確加載,而不是一秒鐘後,我無法加載導航屬性。

我該如何解決這個問題?

編輯

我該怎麼辦: 1.我叫SETLIST()來初始化列表中第一次 2. doStuff都能正常運作 3.我重新與SETLIST 4.接下來通話清單doStuff在試圖使用導航屬性時以異常結束:

var temp = list.where (m=> m.Address.id==addressId).ToList() 

第二次失敗,出現異常:ObjectContext被丟棄。 ..

+0

這也許可以幫助你解決問題了嗎? http://stackoverflow.com/questions/18398356/how-to-solve-the-error-the-objectcontext-instance-has-been-disposed-and-can-no-l – HDD

+2

你沒有顯示上下文的位置被處置,所以不可能準確地說出來。不要將共享成員('Container')用於上下文。他們很便宜 - 創建它們,你需要做什麼,以及它們的處置(確保水合物任何物體與'ToList'或處置之前類似的東西)。 –

+0

我編輯了我的問題......也許它更好理解。我必須使用容器。 :/ – maerlyn

回答

1

問題可能是,默認情況下,導航屬性爲延遲加載。這意味着它們不會被數據庫實際返回,直到您嘗試訪問它們。您正用於創建listObjectContext正在某處放置,這是件好事,因爲您的背景的壽命不會太長。

您在list.where(m => m.Address.id == addressId).ToList()上發生的下一次致電錯誤的原因是因爲您要迭代列表並訪問Address屬性。由於尚未加載,因此EF將嘗試使用list中的實體的父級ObjectContext查詢數據庫。由於父上下文被處置,所以這是不可能的。

更好,更可能更高效的方法來完成這將是加載list時熱切地加載Address屬性。

更改原始查詢到如下所示:

list = queryContainer.Advices 
    .Where(m => /* Some Predicate */) 
    .Include(m => m.Address).ToList(); 
相關問題