使用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重新执行查询的任何建议?
答案 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?
和
似乎存在某种模糊的共识,即SLx确实依赖于浏览器缓存,而不是您从DataService
,DataServiceContext
知道的,或DataServiceQuery
文档。
因此,至少在IE 8中最简单的解决方法是关闭浏览器缓存。