CrmServiceClient.GetEntityMetadata возвращает неверную информацию

Используя сборку Microsoft.CrmSdk для создания сущностей в Dynamics 365 для взаимодействия с клиентами (версия 9), я обнаружил, что метод GetEntityMetadata из CrmServiceClient не получает самую последнюю информацию от сущностей.

Вот код, чтобы показать вам:

using (var svc = new CrmServiceClient(strConn))
{
    EntityMetadata em = svc.GetEntityMetadata(PREFIX + TABLE_NAME_D, EntityFilters.Attributes);
    if (em == null)
    {
        Console.WriteLine($"Create entity [{PREFIX + TABLE_NAME_D}]");
        CreateEntityRequest createRequest = new CreateEntityRequest
        {
            Entity = new EntityMetadata
            {
                SchemaName = PREFIX + TABLE_NAME_D,
                LogicalName = PREFIX + TABLE_NAME_D,
                DisplayName = new Label(TABLE_LABEL, 1036),
                DisplayCollectionName = new Label(TABLE_LABEL_P, 1036),
                OwnershipType = OwnershipTypes.UserOwned,
            },
            PrimaryAttribute = new StringAttributeMetadata
            {
                SchemaName = PREFIX + "name",
                MaxLength = 30,
                FormatName = StringFormatName.Text,
                DisplayName = new Label("Residence", 1036),
            }
        };
        CreateEntityResponse resp = (CreateEntityResponse)svc.Execute(createRequest);
        em = svc.GetEntityMetadata(PREFIX + TABLE_NAME_D, EntityFilters.All);
        // At this point, em is null!!!
    }
}

После получения createResponse сущность хорошо создается в Dynamics, но все же GetEntityMetadata, вызываемая сразу после этого, по-прежнему равна нулю. Если я подожду несколько секунд и сделаю еще один звонок, ответ будет правильным. Но это ужасно! Есть ли способ "форсировать" обновление ответа? Благодарю.

1 ответ

Решение

Хорошо, я нашел это! Это связано с механизмом кэширования. Нужно использовать функцию ResetLocalMetadataCache для очистки кэша, но, похоже, есть проблема с этой функцией. Он будет работать только путем передачи имени объекта в параметре (если вы вызываете его без параметра, он должен очистить весь кэш, но это не работает для меня).

    EntityMetadata em = svc.GetEntityMetadata(TABLE_NAME_D, EntityFilters.All); // Request sent
    em = svc.GetEntityMetadata(TABLE_NAME_D, EntityFilters.All); // Cache used
    svc.ResetLocalMetadataCache(); // No effect?!
    em = svc.GetEntityMetadata(TABLE_NAME_D, EntityFilters.All); // Cache used
    em = svc.GetEntityMetadata(TABLE_NAME_D, EntityFilters.All); // Cache used
    svc.ResetLocalMetadataCache(TABLE_NAME_D); // Cache cleaned for this entity
    em = svc.GetEntityMetadata(TABLE_NAME_D, EntityFilters.All); // Request sent!


Другие вопросы по тегам