CrmServiceClient.GetEntityMetadata returns 错误信息

CrmServiceClient.GetEntityMetadata returns wrong information

使用 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还是null。如果我等几秒钟再打一个电话,现在响应是正确的。但这太可怕了! 有什么办法可以"force"刷新响应吗? 谢谢

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