如果您只想要當前數據,請使用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()。此優化允許您告知實體框架不要跟蹤查詢的結果。這意味着實體框架不會對查詢返回的實體進行額外的處理或存儲。但是這也意味着你不能更新這些實體而不將它們重新附加到跟蹤圖上。
感謝所有的答案。這是一個緩存問題。不知道存在,但現在我知道了。 –