0

Silverlight 4、Oracle 11g、およびEntityFramework4を使用します。

DataServiceQueryを使用してDataGridを埋めます。次に、いくつかのローカル(非EF)コードがDBを更新します。同じクエリを使用して、更新された/新しいデータでDataGridを更新したいと思います。問題は、それを行うと、古い元の結果が返されることです。このコードを実行する前に、変更が実際にDBにコミットされていることを確認しました。

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にクエリを再実行させる方法に関する提案はありますか?

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

デバッグ時にこの動作が見られる場合は、.suoファイルを削除してみてください。

于 2012-05-08T08:16:31.537 に答える
0

この質問に対する驚くべき答えはここにあるようです:

SilverlightはWebサービス呼び出しをキャッシュしますか?

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

SLxが実際にブラウザのキャッシュに依存しているという漠然としたコンセンサスがあるようですが、、、、DataServiceまたはDataServiceContextドキュメントDataServiceQueryから それを知っているわけではありません。

したがって、これに対する最も簡単な修正は、少なくともIE 8では、ブラウザーのキャッシュをオフにすることです。

于 2012-05-08T21:38:01.250 に答える