如何通过Dynamics CRM插件为联系人添加关注者?合并联系人关注者处理方案
解决Dynamics CRM联系人关注者添加及合并继承问题
嘿,这个场景我之前帮客户处理过!合并联系人后主记录不继承被合并者的关注者,确实是CRM默认设计里的一个小遗憾。下面给你拆解解决方案,包括如何用插件实现和「Follow」按钮完全一致的关注效果,以及合并时自动同步关注者的具体步骤:
一、先搞懂「Follow」按钮的底层逻辑
其实点击表单上的「Follow」按钮,本质就是在CRM里创建了一条**Subscription实体**记录,这条记录的关键字段设置如下:
RegardingObjectId:关联到被关注的联系人记录SubscriberId:关联到执行关注操作的系统用户(也就是关注者)SubscriptionType:设为0(这个选项值代表“关注记录”类型)
所以要实现和按钮一样的效果,核心就是在代码里创建符合要求的Subscription记录。
二、合并联系人时自动继承关注者的插件实现
针对你的核心需求——合并后把被合并联系人的关注者同步到主联系人,我们可以写一个Post操作的插件,触发Merge消息来完成自动同步。
完整C#插件代码示例
using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using System; public class ContactMergeSyncFollowers : IPlugin { public void Execute(IServiceProvider serviceProvider) { // 获取插件上下文与组织服务 var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); var service = serviceFactory.CreateOrganizationService(context.UserId); // 只处理Post阶段的Merge操作 if (context.MessageName != "Merge" || context.Stage != 40) return; // 提取合并请求中的主联系人与被合并联系人ID var mergeRequest = (MergeRequest)context.InputParameters["Target"]; Guid mainContactId = mergeRequest.Target.Id; Guid subordinateContactId = mergeRequest.SubordinateId; // 查询被合并联系人的所有有效关注记录 var subscriptionQuery = new QueryExpression("subscription") { ColumnSet = new ColumnSet("subscriberid"), Criteria = new FilterExpression { Conditions = { new ConditionExpression("regardingobjectid", ConditionOperator.Equal, subordinateContactId), new ConditionExpression("subscriptiontype", ConditionOperator.Equal, 0) // 0 = 关注记录 } } }; var existingSubscriptions = service.RetrieveMultiple(subscriptionQuery); // 遍历同步每个关注者到主联系人 foreach (var sub in existingSubscriptions.Entities) { var subscriberRef = (EntityReference)sub["subscriberid"]; // 检查主联系人是否已被该用户关注,避免重复创建 var checkDuplicateQuery = new QueryExpression("subscription") { Criteria = new FilterExpression { Conditions = { new ConditionExpression("regardingobjectid", ConditionOperator.Equal, mainContactId), new ConditionExpression("subscriberid", ConditionOperator.Equal, subscriberRef.Id), new ConditionExpression("subscriptiontype", ConditionOperator.Equal, 0) } } }; var duplicateCheck = service.RetrieveMultiple(checkDuplicateQuery); if (duplicateCheck.Entities.Count == 0) { // 创建新的关注记录 var newSubscription = new Entity("subscription") { ["regardingobjectid"] = new EntityReference("contact", mainContactId), ["subscriberid"] = subscriberRef, ["subscriptiontype"] = new OptionSetValue(0) }; service.Create(newSubscription); } } } }
插件注册要点
- 注册时选择消息为
Merge,实体为contact,阶段为Post Operation(阶段值40)。 - 确保插件执行的用户拥有
subscription实体的创建权限,建议使用特权用户或者开启模拟权限,避免出现权限不足的报错。
三、有没有其他原生方法?
很可惜,目前Dynamics CRM/Dataverse没有原生设置可以修改合并时的关注者继承行为。除了插件,你也可以尝试用Power Automate来监听合并事件并同步关注者,但插件的性能和稳定性会更优,尤其是在批量合并或者高并发的场景下。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

