2011-11-29 53 views
2

使用Studio 2008,C#,SQL Server 2005,Winforms。我已經看遍了這個網站,並找不到一個相同的情況...LINQ to SQL沒有得到正確的數據

我有從LINQ到SQL連接填充data1窗口。我點擊一個按鈕打開data2窗口並在那裏編輯數據。 當我關閉data2窗口時,我需要刷新data1窗口中的數據。 所以我通過LINQ查詢調用SQL Server。我沒有找回剛從data2窗口保存的新數據。我收到已經存在的舊數據。 任何想法爲什麼?我確認數據已保存在SQL數據庫中,並且在那裏。

現在,如果我關閉data1窗口並重新打開它,那麼正確的數據就在那裏。但爲什麼當我關閉data2後重新查詢數據庫窗口是data1窗口中的數據沒有更新?

代碼:

IEnumerable<tblConstructionRevision> newRev1 = (from y in DDBML.tblConstructionRevisions orderby y.RevDate descending, y.RevNo descending where y.DrawID == drawID select y); 

,如果我回去FirstOrDefault或列表不要緊。我無法將它返回到列表<>,因爲我需要整個數據集。

+1

感謝所有的答案。這是一個緩存問題。不知道存在,但現在我知道了。 –

回答

0

如果您只想要當前數據,請使用MergeOption.NoTracking。這意味着它們不會存儲在跟蹤相同上下文中實體更新和刪除的圖表中。如果您正在閱讀的數據已在另一個上下文,窗口或應用程序中更新,則此方法可確保您閱讀的數據將保持最新。應該指出的是,禁用對象跟蹤也會阻止您向數據庫提交更新。所以在閱讀之後,您應該將MergeOption值放入原始文件中。

System.Data.Objects.MergeOption mergeOption = DDBML.tblConstructionRevisions.MergeOption; 
DDBML.tblConstructionRevisions.MergeOption = System.Data.Objects.MergeOption.NoTracking; 

var newRev1 = (from y in DDBML.tblConstructionRevisions 
    orderby y.RevDate descending, y.RevNo descending 
    where y.DrawID == drawID select y); 

DDBML.tblConstructionRevisions.MergeOption = mergeOption; 

或者您可以使用ExecuteStoreQuery()方法,並在參數中指定NoTracking。可以達到相同的效果。

var newRev1=db.ExecuteStoreQuery<tblConstructionRevisions>(
   "SELECT * FROM tblConstructionRevisions y WHERE y.DrawID = @ID 
      order by y.RevDate desc, y.RevNo desc", 
   "tblConstructionRevision", 
   System.Data.Objects.MergeOption.NoTracking, 
   new SqlParameter("@ID", drawID)); 

在實體框架4.1,您可以使用新的AsNoTracking()方法:

var newRev1 = (from y in DDBML.tblConstructionRevisions.AsNoTracking() 
    orderby y.RevDate descending, y.RevNo descending 
    where y.DrawID == drawID select y); 

var newRev1 = (from y in DDBML.tblConstructionRevisions 
    orderby y.RevDate descending, y.RevNo descending 
    where y.DrawID == drawID select y).AsNoTracking(); 

What NoTracking Does

實體框架公開了大量表演這些優化選項可幫助您優化應用程序的性能。其中一個調整選項是.AsNoTracking()。此優化允許您告知實體框架不要跟蹤查詢的結果。這意味着實體框架不會對查詢返回的實體進行額外的處理或存儲。但是這也意味着你不能更新這些實體而不將它們重新附加到跟蹤圖上。