2012-03-19 5 views
2

私はWeb上で見つかったいくつかの提案を適用しようとしましたが、linqでCRM 2011をクエリするときにキャッシュされた結果が残っています。私のweb.configファイルは以下のように、結果のキャッシュを無効にすることになっている、読み取ります。コードでCRM 2011 sdkでクエリキャッシングを回避する方法は?

<configSections> 
    <section name="microsoft.xrm.client" type="Microsoft.Xrm.Client.Configuration.CrmSection, Microsoft.Xrm.Client"/> 
</configSections> 

<connectionStrings> 
    ... 
<connectionStrings> 

<microsoft.xrm.client> 
    <contexts> 
    <add name="Xrm" type="Xrm.XrmServiceContext, Xrm" serviceName="Xrm"/> 
    </contexts> 
    <services> 
    <add name="Xrm" type="Microsoft.Xrm.Client.Services.OrganizationService, Microsoft.Xrm.Client"/> 
    </services> 
</microsoft.xrm.client> 

、私はいくつかのデータを外部の変更を待つために少しテストループを持っている:

Dim crm As New XrmServiceContext("Xrm") 
Dim oOpptyGuid = ' <an existing GUID in the system> 

' Get opportunity by guid. 
Dim oOppty As Xrm.Opportunity = (From c In crm.OpportunitySet Where c.Id.Equals(oOpptyGuid) Select c).SingleOrDefault 
Dim sName As String = oOppty.Name 
Dim iTries As Int16 = 0 

' Wait till name is changed or tried too many times. 
Do 
    ' Sleep between tries. 
    Threading.Thread.Sleep(10000) 
    iTries += 1 
    ' Get opportunity by guid. 
    oOppty = (From c In crm.OpportunitySet Where c.Id.Equals(oOpptyGuid) Select c).SingleOrDefault 
Loop Until oOppty.Name <> sName Or iTries > 10 

上記のループは、CRM内の別の場所で名前が変更されたことを検出しません。私は、ループ内のクエリの前に、ない喜びで、手動でキャッシュから項目を削除しようとしました:

oCacheManager = Microsoft.Xrm.Client.Caching.ObjectCacheManager.GetInstance() 
For Each x As String In From y In oCacheManager Select y.Key 
    oCacheManager.Remove(x) 
Next 

を私の作品だけ事はこれです:

crm.Dispose() 
crm = New XrmServiceContext("Xrm") 

私はそれを生かすことができますが、コードやweb.configのいずれのキャッシュも保証しないために、コンテキストを再作成するのではなく、より良い方法です。しかし私はどこでも私のために働く解決策を見つけることができません。何か不足していますか?

答えて

3

私はあなたの問題はOrganizationServiceのキャッシングではないと思います。あなたの問題は、選択したエンティティのステータスを追跡するサービスコンテキストに関連していると思います。選択しているエンティティでIOrganizationServiceContext.Detachを呼び出すと、それはもはやコンテキストによって追跡されず、検索はサービスからの最新のデータを返すはずです。

+0

ありがとうございました!回答者として誰をマークするかはわかりませんでした。私はポールの返事を読んでから、まずこのアプローチを取り入れたと思います。 :) –

1

IOrganizationServiceCache.Removeメソッドを見てください。

http://msdn.microsoft.com/en-us/library/gg678365.aspx

この程度ニックの権利は、私のオリジナルの考えは少しやり過ぎかもしれません。あなたの場合、コンテキスト内でエンティティをキャッシュするだけです。だから、代わりに:

crm.Dispose() 
crm = New XrmServiceContext("Xrm") 

使用してみてください:

crm.Detach(oOppty) 
関連する問題