WCF数据服务和Silverlight:DataServiceQuery <t>不会重新执行查询</t>

时间:2012-04-27 17:30:33

标签: silverlight entity-framework wcf-data-services

使用Silverlight 4,Oracle 11g和Entity Framework 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,新的DataServiceContext也不会被发送到Oracle服务器。它显然发现它在某个地方有一个缓存的副本。如果我在浏览器中键入查询,它将返回更新的结果。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

Does Silverlight cache web service calls?

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

似乎存在某种模糊的共识,即SLx确实依赖于浏览器缓存,而不是您从DataServiceDataServiceContext知道的,或DataServiceQuery文档。

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