Dynamics CRM - C# Delete Plugin

目的:

在Dynamics CRM 开发中,最常用的就是通过 Create Plugin 和 Update Plugin 来实现各种定制功能,当然也存在使用 Delete Plugin 的情况,本篇就简单讲一下 Delete Plugin 怎么用。

场景:

在CRM开发中,表与表之间通过 lookup 字段来建立,现在假设有以下场景需求:

    比如存在一个产品表A以及一个子产品表B,在表B中建立一个lookup A表的字段,而表A中存在一个字段来统计子产品个数(即在表B中有多少条record是指向自己的),那么这个时候,当某个子产品被删除后(record delete),父产品的统计数需要进行对应的更新,此时可以使用 Delete Plugin 来实现这个需求。

实现:

代码比较简单,在执行上下文时判断是否为 Delete Message 即可:

 1         public void Execute(IServiceProvider serviceProvider)
 2         {
 3             ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
 4             IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
 5             IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
 6             IOrganizationService service = factory.CreateOrganizationService(context.UserId);
 7
 8             try
 9             {
10                 //TODO: Do stuff
11                 if (context.MessageName.Equals("Create"))
12                 {
13                     tracer.Trace("stage " + context.Stage);
14                     switch (context.Stage)
15                     {
16                         case 20:
17                             CreatePlugin(tracer, context, service, factory);
18                             break;
19                         case 40:
20                             break;
21                         default:
22                             break;
23                     }
24                 }
25                 else if (context.MessageName.Equals("Update"))
26                 {
27                     switch (context.Stage)
28                     {
29                         case 20:
30                             UpdatePlugin(tracer, context, service, factory);
31                             break;
32                         case 40:
33                             break;
34                         default:
35                             break;
36                     }
37                 }
38                 else if (context.MessageName.Equals("Delete"))//For Delete Plugin
39                 {
40                     switch (context.Stage)
41                     {
42                         case 10:
43                             DeletePlugin(tracer, context, service, factory);
44                             break;
45                     }
46                 }
47
48             }
49             catch (Exception e)
50             {
51                 throw new InvalidPluginExecutionException(e.Message);
52             }
53
54         }

如何在 Detele Request 中拿到当前 Record 的所有信息,代码如下,先获取 EntityReference 对象,再通过这个对象来查找对应 Record:

 1         private void DeletePlugin(ITracingService tracer, IPluginExecutionContext context, IOrganizationService service, IOrganizationServiceFactory factory)
 2         {
 3             tracer.Trace("Start DeletePlugin()");
 4             try
 5             {
 6                 EntityReference entity = ((EntityReference)context.InputParameters["Target"]);
 7                 Entities.new_entity = service.Retrieve(entity.LogicalName, entity.Id, new ColumnSet(true)).ToEntity<Entities.new_entity>();//获取当前Record的所有信息,之后就可以根据 Lookup 字段来查找父产品  8             }
 9             catch (Exception ex)
10             {
11                 if (ex.GetType().Name == "InvalidPluginExecutionException")
12                 {
13                     throw new InvalidPluginExecutionException(ex.Message + Environment.NewLine);
14                 }
15                 else
16                 {
17                     string errorText = ex.Message.ToString();
18
19                     while (ex.InnerException != null)
20                     {
21                         errorText += ex.InnerException.Message;
22                         ex = ex.InnerException;
23                     }
24                     throw new Exception("Error: " + errorText + "\n");
25                 }
26             }
27             tracer.Trace("End DeletePlugin()");
28         }

Note: CRM 在执行 Delete Request 的时候,与 Create / Update Request 不同,Delete 时 Context 拿到的不是当前 Record 的 Entity 对象,而是 EntityReference 对象,如果强制转换成 Entity 对象会报错,所以记得要把 Execute 方法中这句代码删除:

Entity entity = (Entity)context.InputParameters["Target"];

最后在注册下 Delete Message 即可,使用10 Stage(Pre-validation)或20 Stage(Pre-operation)都可以,一般建议使用10 Stage,因为在20 Stage 时某些 relationship 可能已经删除了,比如 PartyList 类型字段,在20的时候拿不到Value.

  

原文地址:https://www.cnblogs.com/Sunny20181123/p/12007160.html

时间: 2024-10-08 11:45:20

Dynamics CRM - C# Delete Plugin的相关文章

Dynamics CRM - 使用 C# Plugin 调用 SQL 存储过程

有时候,在 Dynamics CRM Plugin 中通过 linq 查询数据会比较慢,可以通过采用在 C# plugin 中直接调用数据库存储过程的方式来提高效率,具体过程如下: 1.新建一个存储过程: ALTER PROCEDURE [dbo].[p_Sample] AS BEGIN SELECT COUNT(dbo.Table.Id) FROM dbo.Table WHERE dbo.Table.Name LIKE '张%' END 2.在 Plugin 中调用存储过程: string s

Dynamics CRM 2013 停用和激活按钮的显示与隐藏

CRM中命令栏上的有些按钮是可以通过权限控制显示和隐藏的,比如新建.保存.保存并关闭.删除等,但惟独激活和停用无法控制,但我们还是可以用权限去控制,只是稍微绕了那么一下. 这里就要涉及到按钮的自定义了,说到按钮的自定义那肯定得用到ribbon workbench,这个工具如何使用不在本文阐述的范围内.见下图,右击active按钮选择customise command(我这边已经生成过了所以是灰的),点击display rule 具体的参数啥意思就不解释了,最后一个参数你是要create呢还是de

How to control PrincipalObjectAccess table growth in Microsoft Dynamics CRM 2011

https://support.microsoft.com/en-us/kb/2664150 How to control PrincipalObjectAccess table growth in Microsoft Dynamics CRM 2011 Email Print SYMPTOMS After you use Microsoft Dynamics CRM 2011, you may notice that the size of the SQL table PrincipalO

How to set up Dynamics CRM 2011 development environment

Recently I have been starting to learn Microsoft Dynamics CRM 2011 about implement plugin and workflow with SDK. The first thing I face is how to set up a development environment for Visual Studio. If you are using Visual Studio 2012 or lower version

Dynamics CRM 2015 Update 1 系列(4): 自己定义主键 - Alternate Keys

Alternate Keys. 还是和系统集成相关的一个重量级Feature.使用该Feature能极大的提高开发数据集成接口的时间成本以及接口的执行效率. 在之前的Dynamics CRM 版本号中.我们仅仅能通过Entity的主键去推断记录的唯一性,如今我们能够通过使用Alternate Keys来推断记录的唯一性.更有趣的则是.我们能够自己去配置实体的Alternate Keys. 眼下Alternate Key仅仅支持文本和数字类型的字段,而且每一个实体最多仅仅能配置5个Key.只是这已

Dynamics CRM 2015 Web API:简介

最近Dynamics CRM又有新动作啦,同学们可知道否,在未来的版本中,我们现在使用的基于SOAP的API们将被淘汰,取代它们的是现在流行的Web API.对于这两类API,各有优势,但是对于微软选择后者,更多的原因还是想在移动端有所建树,毕竟基于SOAP的API对于移动端来说显得过于笨重. 这消息对我们来说有好也是有坏的,坏处就是,哈哈,大家又要开始学习一套新的API编程知识:至于好处嘛,那就是Web API更灵活,我们仅仅需要写几行代码就能实现API调用.例如:如果我们用SOAP API在

Dynamics CRM 编程之单元测试技术: Microsoft Fake Framework

对于基于复杂的框架进行编程,最难的地方并不是编写代码,而是怎么快速有效的去调试出错的代码,怎么高效精准的完成代码的单元测试.就拿Dynamics CRM Plugin的编写来看,编写一个上千行代码的插件不是一件很难的事情,但是,如果把这上千行代码调试完成并让它行之有效的按我们的目的精准的进行呢?这也是初级技术员和高级技术员的核心差距. 今天给大家带来一篇关于Plugin的单元测试文章,博主2年前撰写过另外一篇类似的单元测试文档,使用的是Rhino Mock技术.但是今天我们要使用的技术,则是Mi

Dynamics CRM 2015 Update 1 系列(4): Alternate Keys

Alternate Keys, 还是和系统集成相关的一个重量级Feature.使用该Feature能极大的提高开发数据集成接口的时间成本以及接口的运行效率. 在之前的Dynamics CRM 版本中,我们只能通过Entity的主键去判断记录的唯一性,现在我们可以通过使用Alternate Keys来判断记录的唯一性,更有趣的则是,我们可以自己去配置实体的Alternate Keys. 目前Alternate Key只支持文本和数字类型的字段,并且每个实体最多只能配置5个Key,不过这已经很不错了

Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynamics CRM 2011 2013 解决办法

Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynamics CRM 2011解决办法: John 25 Apr 2012 9:03 AM Yes thanks.  We were having this issue when importing a solution out of our development system that contain