0

使用 Microsoft.CrmSdk 程序集在 Dynamics 365 for Customer Engagement(版本 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 仍然为空。如果我等待几秒钟再打一个电话,现在响应是正确的。但这太可怕了!有没有办法“强制”刷新响应?谢谢。

4

1 回答 1

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!


于 2019-08-02T08:38:04.907 回答