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!