0

使用 Silverlight 4、Oracle 11g 和实体框架 4。

我使用 DataServiceQuery 来填充 DataGrid。然后,一些本地(非 EF)代码更新数据库。我想使用相同的查询来用更新/新数据刷新 DataGrid。问题是,当我这样做时,它会返回旧的原始结果。我已经验证了这些更改实际上已在此代码运行之前提交到数据库:

DataServiceContext<T> dsContext= new DataServiceContext<T>(uri);
dsContext.MergeOption = MergeOption.NoTracking;
dsContext.SaveChangesDefaultOptions = SaveChangesOptions.ReplaceOnUpdate;
DataServiceQuery<T> dsQuery = dsContext.CreateQuery<T>(typeof(T).Name);
// oldQuery is an IQueryable<T>
dsQuery = (DataServiceQuery<T>)oldQuery;

var dsQuery = (DataServiceQuery<T>)oldQuery;
dsQuery.BeginExecute(new AsyncCallback(c =>
   {
      IEnumerable<T> result = dsQuery.EndExecute(c);
      listSelectedRecord = new List<T>();
      listSelectedRecord = result.ToList();
   }), dsQuery);

据我所知,新dsQuery的甚至没有被发送到 Oracle 服务器,即使DataServiceContext正在创建一个新的。它显然发现它在某处有一个缓存副本。如果我在浏览器中输入查询,它会返回更新的结果。

关于如何强制 DS 重新执行查询的任何建议?

4

3 回答 3

0

分配oldQuery给新实例化的dsQuery对象显然会从某处复制缓存的结果。我在这里使用的解决方案是替换

 dsQuery = (DataServiceQuery<T>)oldQuery;

dsQuery = (DataServiceQuery<T>)(dsQuery.Provider.CreateQuery<T>(oldQuery.Expression));

我仍然想准确了解这些结果的缓存位置、原因和方式。文档对此DataServiceQuery<T>只字未提:

http://msdn.microsoft.com/en-us/library/cc646574(v=vs.95).aspx

于 2012-05-02T00:40:54.930 回答
0

这个问题的惊人答案似乎可以在这里找到:

Silverlight 是否缓存 Web 服务调用?

https://connect.microsoft.com/VisualStudio/feedback/details/340931/silverlight-webclient-does-not-download-updated-resources

似乎存在某种模糊的共识,即 SLx 确实依赖于浏览器DataService缓存,而不是您从、DataServiceContextDataServiceQuerydocs 中 知道这一点。

因此,至少在 IE 8 中,最简单的解决方法是关闭浏览器缓存。

于 2012-05-08T21:38:01.250 回答
0

如果在调试时看到此行为,您可以尝试删除 .suo 文件。

于 2012-05-08T08:16:31.537 回答