2011-12-21 78 views
0

我從來沒有對數據庫的任何更改沒有反映出問題,因爲我之前對數據進行了存儲庫調用。但現在似乎正在發生。如何確保使用實體框架存儲庫調用不被緩存?

在此之前,這樣的存儲庫調用一直處於使用存儲庫模式的上下文中,其中存儲庫i/f注入到服務/控制器構造函數中。

我有一個電子郵件任務寫成一個控制檯應用程序,其中包含一個while()循環,它詢問數據庫的電子郵件帳戶,然後從各自的服務器下載電子郵件。問題是,每次我調用_emailSettingsRepo.GetAll()方法時,所有設置都是舊的,並且不顯示數據庫的任何更改,即使我可以看到management studio中的更改。我猜這是因爲我通過在循環中使用相同的回購使用相同的數據庫上下文,所以使GetAll()方法調用沒有任何區別。

這是否意味着緩存從來就不是問題,因爲每次有新的請求進入控制器時,都會重新創建數據庫上下文?我如何解決這個問題?

回答

1

創建一個背景下,當你需要它,事後處置它,是這樣的:

while (true) 
{ 
    using (var context = new MyContext()) 
    { 
     _emailSettingsRepo = new EmailSettingsRepo(context); 
     var all = _emailSettingsRepo.GetAll(); 

     // Process all 
    } 
    // context gets disposed here, 
    // garbage collection removes objects from context ("cache"), 
    // next run creates new "empty" context 

    bool cancelled = WaitAnHourOrCancel(); 
    if (cancelled) 
     break; 
} 

這個控制檯應用程序與Web應用程序有關的上下文管理相比較,認爲每個運行循環是一個Web請求。如果您在Web應用程序中使用IOC容器(例如Ninject),容器很可能會創建上下文併爲您處理。但它總是一對context = new MyContext()context.Dispose()以及兩者之間的請求處理。所以,基本上和上面例子中的using塊一樣。您只需在控制檯應用程序中明確地執行此操作即可。