LINQ到SQL没有得到正确的数据
本文关键字:数据 SQL LINQ | 更新日期: 2023-09-27 18:16:19
使用Studio 2008, c#, SQL Server 2005, Winforms。我找遍了这个网站,没有找到一个相同的情况…
我有数据窗口填充从LINQ到SQL连接。我点击一个按钮打开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还是list并不重要。我不能将它返回到List<>,因为我需要整个数据集
已缓存,请查看- http://blogs.msdn.com/b/dinesh.kulkarni/archive/2008/07/01/linq-to-sql-tips-9-understanding-datacontext-s-internal-caching.aspx
您需要使用数据上下文的Refresh方法来使缓存无效
听起来您的表单中保留了DDBML。我认为只要上下文是打开的,它就会缓存跟踪的实体。您应该使用数据上下文,然后处理它,并在需要时打开一个新的数据上下文。有关缓存的更多信息,请参阅:http://blogs.msdn.com/b/dinesh.kulkarni/archive/2008/07/01/linq-to-sql-tips-9-understanding-datacontext-s-internal-caching.aspx
如果您只想要当前数据,请使用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));
在Entity Framework 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();
NoTracking的作用
Entity Framework提供了许多性能调优选项来帮助您优化应用程序的性能。其中一个调优选项是. asnotracking()。这种优化允许你告诉实体框架不要跟踪查询的结果。这意味着实体框架不执行查询返回的实体的额外处理或存储。但是,这也意味着如果不将这些实体重新附加到跟踪图上,则无法更新它们。