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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:08:33