我一直在使用實體框架和SQL Server 3.5開發一些單用戶桌面應用程序。我以爲我曾經在某處讀過一次記錄在EF緩存中的一個上下文,如果使用不同的上下文刪除它們,即使執行新的查詢,也不會從第一個上下文的緩存中刪除它們。因此,我一直在編寫非常低效且令人迷惑的代碼,所以無論何時其他方法使用自己的上下文修改數據庫,我都可以處理上下文並實例化一個新上下文。EF緩存對SQL Server CE 3.5的工作方式不同嗎?
我最近發現了一些代碼,我沒有在這些條件下重新實例化第一個上下文,但它仍然有效。我寫了一個簡單的測試方法,看看發生了什麼事情:
using (UnitsDefinitionEntities context1 = new UnitsDefinitionEntities())
{
List<RealmDef> rdl1 = (from RealmDef rd in context1.RealmDefs
select rd).ToList();
RealmDef rd1 = RealmDef.CreateRealmDef(100, "TestRealm1", MeasurementSystem.Unknown, 0);
context1.RealmDefs.AddObject(rd1);
context1.SaveChanges();
int rd1ID = rd1.RealmID;
using (UnitsDefinitionEntities context2
= new UnitsDefinitionEntities())
{
RealmDef rd2 = (from RealmDef r in context2.RealmDefs
where r.RealmID == rd1ID select r).Single();
context2.RealmDefs.DeleteObject(rd2);
context2.SaveChanges();
rd2 = null;
}
rdl1 = (from RealmDef rd in context1.RealmDefs select rd).ToList();
在最後一行我很驚訝地發現,添加和刪除實體實際上不通過在第二查詢返回設置斷點第一個上下文!
我幾種可能的解釋:
- 我在我的理解完全錯誤的,該緩存的記錄 不會在再次查詢刪除。
- EF在高速緩存中反覆無常,這是一個運氣問題。
- EF 4.1中的緩存已更改。
- 如果在同一進程中實例化兩個上下文,則不會出現此問題。
- 緩存對SQL CE 3.5的工作方式與其他版本的SQL 服務器不同。
我懷疑答案可能是最後兩個選項之一。如果我不這樣做,我真的寧願不必處理所有的麻煩,爲單用戶桌面應用程序不斷重新實例化上下文。
我可以依賴這種爲使用SQL CE(3.5和4)的單用戶桌面應用程序發現的行爲嗎?
馬克在他的問題分析(請參閱我的答案)基本上是正確的。將我的項目轉換爲DbContext在我的議程上。回覆。第一條評論:當然,對於ASP.Net,Silverlight或Metro應用程序以及訪問遠程/分離數據庫的應用程序,上下文應該是暫時的。但作爲一個老FoxPro程序員,我發現它不得不處理編輯分離的實體或複製的數據,然後將數據保存回數據庫,以便使用本地連接的數據庫進行適度的單用戶桌面應用程序。在這種情況下,對象數據模型的功能和清晰度會被不必要的複雜代碼所稀釋。 – 2012-08-08 11:16:06