CrmServiceClient.GetEntityMetadata返回错误的信息

时间:2019-08-01 09:45:11

标签: dynamics-crm dynamics-365 common-data-service

使用Microsoft.CrmSdk程序集在Dynamics 365中为客户参与生成实体(版本9),我发现CrmServiceClient的GetEntityMetadata方法无法从实体中获取最新信息。

以下代码可为您显示:

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仍然为null。如果我等待几秒钟再打个电话,现在响应是正确的。但这太可怕了! 有什么方法可以“强制”刷新响应? 谢谢。

1 个答案:

答案 0 :(得分:0)

好,我找到了!它链接到缓存机制。 必须使用函数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!