CRM插件C#:Post事件中根据部门Lookup自动设置校区Lookup字段
后续执行步骤与代码完善指南
看起来你已经拿到了插件的上下文入口,接下来咱们一步步把这个自动赋值的逻辑补全并配置好:
1. 完善实体与服务获取
首先把获取Student实体和OrganizationService的代码补全,还要判断当前插件触发的场景(创建/更新):
var context = serviceProvider.GetService(typeof(IPluginExecutionContext)) as IPluginExecutionContext; var serviceFactory = serviceProvider.GetService(typeof(IOrganizationServiceFactory)) as IOrganizationServiceFactory; IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); // 获取目标Student实体(支持创建和更新场景) if (!context.InputParameters.Contains("Target") || !(context.InputParameters["Target"] is Entity student)) { return; // 如果没有目标实体,直接退出 } // 只在Department字段有值或变更时执行逻辑 if (!student.Contains("department")) // 替换成你实际的department字段逻辑名 { return; }
2. 获取选中的Department引用
从Student实体里提取选中的Department的EntityReference,注意要处理空值情况:
EntityReference deptRef = student.GetAttributeValue<EntityReference>("department"); // 替换为实际字段名 if (deptRef == null) { return; }
3. 查询Department对应的Campus值
调用OrganizationService查询Department实体,获取它关联的Campus字段值,为了性能,只查询需要的字段:
// 查询Department的Campus字段 Entity department = service.Retrieve( deptRef.LogicalName, deptRef.Id, new ColumnSet("campus") // 替换为Department实体上的campus字段逻辑名 ); EntityReference campusRef = department.GetAttributeValue<EntityReference>("campus"); if (campusRef == null) { // 可以在这里加日志或提示,比如该Department未关联Campus return; }
4. 为Student设置Campus字段
如果你的插件注册在PreOperation阶段(推荐),直接修改Target里的Student实体即可,不需要额外调用Update:
// 给Student的campus字段赋值 student["campus"] = campusRef; // 替换为Student实体上的campus字段逻辑名
如果是注册在PostOperation阶段,就需要调用service.Update(student)来保存变更。
5. 插件注册配置(关键步骤)
这一步决定插件能不能正常触发:
- 注册消息:选择
Create和Update,覆盖创建新Student和修改Department的场景 - 触发阶段:推荐选PreOperation,因为直接修改Target实体,不需要额外的更新操作,性能更好
- 筛选条件:添加筛选规则,只当
department字段的值发生变化(或创建时存在值)时触发,避免插件无意义执行 - 实体:选择你的自定义
student实体 - 执行用户:建议选
执行插件的用户或者拥有足够权限的系统用户,确保能查询Department实体
6. 测试与异常处理
- 测试场景:创建新Student并选择Department,检查Campus是否自动填充;修改已有Student的Department,检查Campus是否同步更新
- 异常处理:在代码里添加
try-catch块,捕获异常并记录日志(比如使用ITracingService),避免插件报错导致业务操作失败:
var tracingService = serviceProvider.GetService(typeof(ITracingService)) as ITracingService; try { // 把上面的逻辑放在这里 } catch (Exception ex) { tracingService?.Trace("插件执行异常: {0}", ex.ToString()); throw; // 抛出异常终止操作,或者根据需求处理 }
内容的提问来源于stack exchange,提问作者Karam Haj
相关产品推荐
相关产品推荐

