2011-10-05 78 views
7

我有一個站點管理一組規則和一個單獨的Windows窗體應用程序,根據數據庫中的規則進行文件級別更改。如何強制EF代碼優先查詢數據庫?

這兩個應用程序都對EF Code First DbContext使用相同的庫,但每個應用程序都在實例化它們自己的上下文副本。

問題是,上下文的每個運行版本都不知道其他版本所做的更改。例如。如果我在網站上更改規則,表單應用程序仍然具有以前的版本。

我知道我可能會對此錯誤的方法,並應具有某種通過JSON/REST從網站上的表格應用程序數據訪問,但我不希望其他原因。

有沒有辦法在上下文中「禁用緩存」,並強制每個查詢命中數據庫?

回答

10

不,沒有辦法禁用緩存。您必須手動將每個查詢設置爲reaload數據。該功能不適用於DbContext API =>您必須使用ObjectContext API。

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
ObjectSet<YourEntity> set = objectContext.CreateObjectSet<YourEntity>(); 
set.MergeOption = MergeOption.OverwriteChanges; 
var query = from x in set where ... select x;  

或者更簡單的方案:如果可能的話,而不是在同樣的背景下我們新的一個正在運行的查詢使用更好的上下文管理。

Btw。在winform應用程序中暴露服務並通過網站使用服務的想法是錯誤的。您需要第三個服務應用程序(託管在Web服務器上或作爲Windows服務),並且網站和winform應用程序都將通過該新應用程序訪問數據庫。 EF將只在新的應用程序中。

編輯:

如果您的WinForm應用程序不會更改從數據庫加載數據你也可以使用這樣的:

var query = from x context.YourEntities.AsNoTracking() where ... select x; 

這將關閉實體的內部變化跟蹤,它也應該強制EF每次都會重新加載實體,但這會使存儲更改變得更加困難。

+0

我喜歡簡單的場景:)我現在有通過DI通過構造函數創建的存儲庫。我想我將不得不覈實它並使用服務定位器根據需要生成新的上下文? – mattdwen

+0

比方說,「YourEntity」有相關的「用戶」的實體,它們不與MegeOption.OverwriteChanges刷新,如何刷新YourEntity.Users也什麼建議嗎? –