Dynamics 365 CRM:关联仅一个EntityB时自动填充EntityA查找字段
嘿,这个自动填充的需求我之前帮客户实现过,刚好适配你的场景!咱们分两种常用方案来搞,不管你是喜欢低代码还是写代码都能搞定:
方案1:Power Automate 低代码实现(推荐非开发人员)
这个方案不用写代码,通过可视化配置就能完成:
- 触发规则:新建一个云流,触发条件选「当 Dataverse 记录被创建时」,实体选你的
EntityA,额外加个触发筛选:Contact 字段不为空(毕竟从Contact新建时这个字段会自动填充,咱们只处理有Contact值的情况) - 查询关联的EntityB:添加「列出记录」动作,实体选
EntityB,筛选条件设置为_contact_value eq @triggerBody()?['_contact_value'](这里的_contact_value是Contact查找字段的逻辑名称,你要换成自己系统里的实际字段名哦) - 判断并填充:加一个「条件」动作,判断刚才列出的EntityB记录数量是否等于1
- 如果满足条件:添加「更新记录」动作,实体选
EntityA,记录ID用触发的那条EntityA的ID,然后把EntityB查找字段设置为列出的那条EntityB记录的ID - 如果不满足:啥也不用做,或者可以加个发送邮件/Teams消息的动作,提醒创建人“当前Contact关联了多个EntityB,请手动选择”
- 如果满足条件:添加「更新记录」动作,实体选
- 小提醒:因为EntityB是必填字段,建议把它的必填类型设为「业务必填」而非「系统必填」,这样创建时不会因为字段为空直接报错,等流跑完填充后再满足必填要求
方案2:Dataverse 插件代码实现(适合开发人员)
如果是开发同学,写个插件注册在EntityA的Create事件上更灵活:
- 插件核心逻辑:
- 从新建的EntityA记录里拿到Contact的ID
- 查询该Contact关联的所有EntityB记录(用FetchXML或者LINQ都可以,这里用FetchXML示例)
- 如果查询结果只有1条,就把这条EntityB的ID赋值给EntityA的EntityB查找字段
- 示例C#代码片段:
// 获取EntityA记录里的Contact字段值 var contactRef = entity.GetAttributeValue<EntityReference>("contactid"); if (contactRef != null) { // 编写FetchXML查询关联的EntityB,最多查2条(只要判断数量是否为1,查2条足够) var fetchXml = $@" <fetch count='2'> <entity name='entityb'> <filter> <condition attribute='contactid' operator='eq' value='{contactRef.Id}' /> </filter> </entity> </fetch>"; var entityBResults = service.RetrieveMultiple(new FetchExpression(fetchXml)); // 如果只有1条关联的EntityB,就填充字段 if (entityBResults.Entities.Count == 1) { entity["entitybid"] = new EntityReference("entityb", entityBResults.Entities[0].Id); } }
- 注册插件时注意:把执行顺序设为「后操作」,确保在系统自动填充Contact字段之后再执行咱们的逻辑,避免拿不到Contact的值
额外优化:客户端JavaScript预填充
如果是从Contact表单的子网格新建EntityA,还可以在客户端用JS提前填充,让用户在创建时就能看到结果:
- 在EntityA的新建表单加载时,获取当前Contact的ID(从表单的上下文参数里拿)
- 用Web API查询该Contact关联的EntityB数量
- 如果数量是1,就把EntityB字段的值自动填充到表单里
- 这样用户提交前就能确认字段已填充,体验更好
内容的提问来源于stack exchange,提问作者user9487332




