在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
相关产品推荐
相关产品推荐

