【问题标题】:WCF Data Service and Silverlight: DataServiceQuery<T> will not re-perform queryWCF 数据服务和 Silverlight:DataServiceQuery<T> 不会重新执行查询
【发布时间】:2012-05-09 05:44:52
【问题描述】:

使用 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);

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

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

【问题讨论】:

  • 相关链接:forums.asp.net/t/1363040.aspx/1 如上所示,我已经在使用 MergeOption.NoTracking 标志了。
  • 我还注意到,如果我查看 dsContext.Entities,这个 DataServiceContext 对象似乎根本没有跟踪任何实体! Silverlight 数据服务客户端与 .NET 完整版有何不同?

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


【解决方案1】:

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

 dsQuery = (DataServiceQuery<T>)oldQuery;

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

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

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

【讨论】:

  • 实际上,这似乎不再起作用了……仍然欢迎提出建议。
  • 中间有没有像htmlcache或者appfabric缓存这样的缓存?
  • 不,但为了确定,我在 DataService OnStartProcessingRequest 中设置了 SetNoServerCaching。我已经直接监控了 WCF 服务,正如我所说,我没有看到任何证据表明请求甚至会发送到服务器,更不用说从服务器获取缓存结果了。
  • 您是否能够调试代码并查看执行过程是否确实命中了加载的查询? (很抱歉试图看到任何明显的问题,我相信你已经这样做了。)
  • 是的,它确实命中了查询并执行了回调。我一直在通过查看变量 listSelectedRecord 来检查结果,因此它清楚地执行了 BeginExecute。但是,不会发生的是对数据服务的调用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    Does Silverlight cache web service calls?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多