You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Dynamics 365插件中动态获取发布者前缀的方法

解决Dynamics 365插件中动态获取发布者前缀与目标实体的问题

一、动态获取发布者前缀的两种实用方法

1. 获取环境默认发布者前缀

如果自定义实体属于环境默认发布者,直接查询publisher实体即可拿到前缀:

// 假设service为IOrganizationService实例
var defaultPublisherQuery = new QueryExpression("publisher")
{
    ColumnSet = new ColumnSet("prefix"),
    Criteria = new FilterExpression
    {
        Conditions = { new ConditionExpression("isdefault", ConditionOperator.Equal, true) }
    }
};

var publisherResults = service.RetrieveMultiple(defaultPublisherQuery);
if (publisherResults.Entities.Any())
{
    string defaultPrefix = publisherResults.Entities[0].GetAttributeValue<string>("prefix");
    // 拼接目标实体逻辑名,例如基础名为"operationlog",则完整逻辑名为 prefix + "_operationlog"
    string targetEntityLogicalName = $"{defaultPrefix}_operationlog";
}

2. 通过实体显示名称直接获取带前缀的逻辑名

若不确定前缀,但知道目标实体的界面显示名称(如“操作日志”),可通过元数据请求直接获取带前缀的逻辑名,无需手动拼接:

var retrieveEntityReq = new RetrieveEntityRequest
{
    EntityFilters = EntityFilters.Entity,
    RetrieveAsIfPublished = true,
    // LCID对应语言:中文用2052,英文用1033,需与环境语言匹配
    DisplayName = new Label("操作日志", 2052)
};

var retrieveEntityResp = (RetrieveEntityResponse)service.Execute(retrieveEntityReq);
string targetEntityLogicalName = retrieveEntityResp.EntityMetadata.LogicalName;

二、优雅关联目标实体(避免硬编码/遍历)

推荐用环境变量存储目标实体的关键标识,无需修改代码即可在Dynamics界面配置,步骤如下:

1. 配置环境变量

在Dynamics 365中创建环境变量:

  • 架构名:new_TargetOperationLogEntity(可自定义)
  • 显示名称:目标操作日志实体
  • 值:填写目标实体的显示名称(如“操作日志”)或Schema名

2. 插件中读取环境变量并获取实体逻辑名

// 读取环境变量
var envVarQuery = new QueryExpression("environmentvariable")
{
    ColumnSet = new ColumnSet("value"),
    Criteria = new FilterExpression
    {
        Conditions = { new ConditionExpression("schemaname", ConditionOperator.Equal, "new_TargetOperationLogEntity") }
    }
};

var envVarResults = service.RetrieveMultiple(envVarQuery);
if (envVarResults.Entities.Any())
{
    string entityDisplayName = envVarResults.Entities[0].GetAttributeValue<string>("value");
    
    // 获取目标实体逻辑名
    var retrieveReq = new RetrieveEntityRequest
    {
        EntityFilters = EntityFilters.Entity,
        RetrieveAsIfPublished = true,
        DisplayName = new Label(entityDisplayName, 2052)
    };
    
    var retrieveResp = (RetrieveEntityResponse)service.Execute(retrieveReq);
    string targetEntityLogicalName = retrieveResp.EntityMetadata.LogicalName;
    
    // 执行记录创建操作
    var newRecord = new Entity(targetEntityLogicalName);
    newRecord["new_description"] = "插件触发的操作记录";
    service.Create(newRecord);
}

关键优势说明

  • 无硬编码:通过环境变量适配不同环境的发布者前缀,无需修改插件代码
  • 性能优异:使用RetrieveEntityRequest精准查询单实体元数据,远优于遍历所有实体的RetrieveAllEntitiesRequest
  • 可维护性强:直接在Dynamics界面调整目标实体配置,降低维护成本

内容的提问来源于stack exchange,提问作者Junaid Soomro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:27:45