通过


检索已发布的元数据

类别:性能、使用情况

影响潜力:高

症状

检索未发布的元数据可能会导致:

  • 性能较慢
  • 用户混淆

Guidance

检索未发布的自定义项并不常见,你很少需要检索这些自定义项。

如果要创建应用程序来编辑可自定义元数据,可能需要检索未发布的自定义项。 例如,如果创建自定义元数据编辑器,则必须检索这些项的任何未发布定义。 如果开发人员定义了一些更改但未发布这些更改,则应用程序必须能够检索这些更改,以确保开发人员正在检索最新的开发自定义项。 未能这样做可能导致未发布的自定义设置丢失。

但是,如果不创建编辑器或没有显式需要检索未发布的定义,则仅检索已发布的定义。 以下示例演示如何检索已发布的自定义项:

默认行为

默认情况下,检索元数据时仅获取已发布的自定义项。

public RetrieveAllEntitiesAttributesResponse GetAllEntitiesImplicit(IOrganizationService service)
{
    var request = new RetrieveAllEntitiesRequest();
    request.EntityFilters = EntityFilters.Attributes;

    return service.Execute(request) as RetrieveAllEntitiesAttributesResponse;
}

显式控制行为

显式设置属性 RetrieveAsIfPublished 以仅检索已发布的自定义项。

public RetrieveAllEntitiesAttributesResponse GetAllEntitiesExplicit(IOrganizationService service)
{
    var request = new RetrieveAllEntitiesRequest()
    {
        RetrieveAsIfPublished = false
        EntityFilters = EntityFilters.Attributes
    };

    return service.Execute(request) as RetrieveAllEntitiesAttributesResponse;
}

有问题的模式

以下操作可以通过 RetrieveAsIfPublished 参数检索未发布的元数据:

以下示例演示如何检索未发布的自定义项:

警告

避免出现这些情况。

public RetrieveEntityKeyResponse GetEntityKey(IOrganizationService service, string entityName, string keyName)
{
    var request = new RetrieveEntityKeyRequest()
    {
        EntityLogicalName = entityName,
        LogicalName = keyName,
        RetrieveAsIfPublished = true
    };

    return service.Execute(request) as RetrieveEntityKeyResponse;
}

public RetrieveRelationshipResponse GetRelationship(IOrganizationService service, Guid id)
{
    var request = new RetrieveRelationshipRequest()
    {
        MetadataId = id,
        RetrieveAsIfPublished = true
    };

    return service.Execute(request) as RetrieveRelationshipResponse;
}

public RetrieveEntityAttributesResponse GetEntity(IOrganizationService service, Guid id)
{
    var request = new RetrieveEntityRequest()
    {
        MetadataId = id,
        RetrieveAsIfPublished = true,
        EntityFilters = EntityFilters.Attributes
    };

    return service.Execute(request) as RetrieveEntityAttributesResponse;
}

Web API 函数

本指南也适用于以下 Web API 函数:

其他信息

Dynamics 365服务允许检索已发布或未发布的某些元数据。 自 Dynamics CRM 2011 起,应用程序内存中元数据缓存默认返回已发布元数据,除非显式将 RetrieveAsIfPublished 属性设置为 true

检索未发布的元数据会增加处理请求的开销,因此它会执行速度更慢。 它还可以返回请求者不需要的元数据。 例如,检索未发布的选项集元数据可以返回用户界面中不可见的标签值,从而导致最终用户混淆。

另请参阅

RetrieveEntityRequest.RetrieveAsIfPublished 属性
使用 .NET SDK 处理元数据
将 Web API 与元数据结合使用
发布自定义项