Как предотвратить кэширование запросов в CRM 2011 SDK? - PullRequest
2 голосов
/ 19 марта 2012

Я пытался применить несколько предложений, найденных в Интернете, но все еще получаю кэшированные результаты при запросах CRM 2011 с linq.Мой web.config выглядит следующим образом, что должно отключить кэширование результатов:

<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

only вещь, которая работает для меня, такова:

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

Я могу с этим смириться, но было бы неплохо вместо воссоздания контекста иметь способ гарантировать отсутствие кэширования ни в коде, ни в web.config.Но я не могу найти решение где-нибудь, что работает для меня.Я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Не думаю, что ваша проблема в кэшировании OrganizationService. Я полагаю, что ваша проблема связана с контекстом службы отслеживания статуса выбранного объекта. Если вы вызываете IOrganizationServiceContext.Detach для выбранной сущности, она больше не будет отслеживаться контекстом, и извлечение должно возвращать самые последние данные из службы.

1 голос
/ 20 марта 2012

Посмотрите на метод IOrganizationServiceCache.Remove.

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

Ник прав насчет этого, моя первоначальная мысль может быть немного излишней. В вашем случае вы кэшируете сущность только в контексте. Так что вместо:

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

попробуйте использовать:

crm.Detach(oOppty)
...