类别:性能、使用情况
影响潜力:高
症状
检索未发布的元数据可能会导致:
- 性能较慢
- 用户混淆
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 参数检索未发布的元数据:
- RetrieveAllEntitiesRequest
- RetrieveAllOptionSetsRequest
- RetrieveAttributeRequest
- RetrieveEntityRequest
- RetrieveOptionSetRequest
- RetrieveRelationshipRequest
- RetrieveEntityKeyRequest
以下示例演示如何检索未发布的自定义项:
警告
避免出现这些情况。
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 与元数据结合使用
发布自定义项