2013-10-24 33 views
4

所以我有一個類似下面的類。有一個線程使用實體框架代碼第一個DbContext進行一些工作。實體框架 - MultipleActiveResultSets對緩存的影響

我遇到的問題是,它似乎像m_DB上下文緩存即使它應該設置,並重新對每個處理循環的數據。

我所看到的是一個關係的一些數據沒有出現在加載的模型。如果我殺了並重新啓動過程突然發現數據就像它應該。

我能想到的唯一的事情就是這個應用程序在數據庫連接字符串中使用了MultipleActiveResultSets = true,但我找不到任何明確說明這會導致我看到的行爲的任何內容。

任何有識之士將不勝感激。


public class ProcessingService 
{ 

    private MyContext m_DB = null 
    private bool m_Run = true; 

    private void ThreadLoop() 
    { 
    while(m_Run) 
    { 
     try 
     { 
     if(m_DB == null) 
      m_DB = new MyContext(); 
     } 
     catch(Exception ex) 
     { 
     //Log Error 
     } 
     finally 
     { 
     if(m_DB != null) 
     { 
      m_DB.Dispose(); 
      m_DB = null; 
     } 
     } 
    } 
    } 

    private void ProcessingStepOne() 
    { 
    // Do some work with m_DB 
    } 

    private void ProcessingStepTwo() 
    { 
    // Do some work with m_DB 
    } 
} 

+0

緩存在AppDomain中的唯一東西是EF模型(商店模型,概念模型和映射),而不是數據。這真的取決於你在循環中做什麼。你能再多展示一下嗎? –

+0

這就是我已經讀過並計算出來的,但我肯定會得到陳舊/緩存的數據。我發佈了一個我認爲正在發生的事情的答案。 – raytiley

回答

3

多活動結果集或MARS是其中一個連接可以通過多個活動結果集可以使用(正如名字所暗示的)SQL 2005/2008和ADO.NET的一個特徵。嘗試關閉連接字符串並觀察應用程序的行爲,我猜測這可能是您的問題的可能原因。閱讀下面的MSDN鏈接瞭解更多火星

MSDN - Multiple Active Result Sets

編輯: 嘗試:

var results = context.SomeEntitiy.AsNoTracking() where this = that select s; 

AsNoTracking()關閉實體的內部變化跟蹤,同時也應強制實體框架來重新加載實體每次。

無論說和做,你將需要重新理的一些量,因爲顯然有在你的代碼中的設計缺陷。

+0

關閉MARS將需要大量的重構。我不同意,但我想確定它的最新情況是否會導致我的問題。我去過那個鏈接,找不到任何說明MARS如何影響dbContext緩存的內容。 – raytiley

2

我討厭回答我的問題,尤其是當我沒有,爲什麼它解決了這個問題一個很好的解釋。

我最終消除MARS和它沒有解決我的問題。我最好的解釋是這樣的:

無論是否返回結果,也不管結果是否返回結果,以及返回多個結果的批處理,總是讀到結果的末尾。 (http://technet.microsoft.com/en-us/library/ms131686.aspx

我的應用程序沒有通過所有的結果總是讀回,所以其我的理論,這部分怎麼造成的數據獲取緩存和重用的新DbContext