Dynamics crm 2011 Dynamics CRM检测删除消息是否为级联删除

Dynamics crm 2011 Dynamics CRM检测删除消息是否为级联删除,dynamics-crm-2011,dynamics-crm,dynamics-crm-2013,Dynamics Crm 2011,Dynamics Crm,Dynamics Crm 2013,我有一个自定义工作流活动,该活动在删除自定义实体时运行。 我需要确定删除消息是来自父实体(Opportunity)的常规删除还是级联删除。 我发现即使存在级联删除,父实体也存在。 如果删除是级联删除的结果,我还可以查看哪些内容 我需要获取此信息,因为自定义实体在删除时正在更新父实体-它只应在删除不是级联删除的结果时更新,否则会发生SQL错误,这可能是因为工作流正在尝试更新事务中正在删除的记录 编辑 Tanguy T,但未解决。我相信您可以检查工作流上下文的ParentContext成员。如果为n

我有一个自定义工作流活动,该活动在删除自定义实体时运行。
我需要确定删除消息是来自父实体(Opportunity)的常规删除还是级联删除。

我发现即使存在级联删除,父实体也存在。

如果删除是级联删除的结果,我还可以查看哪些内容

我需要获取此信息,因为自定义实体在删除时正在更新父实体-它只应在删除不是级联删除的结果时更新,否则会发生SQL错误,这可能是因为工作流正在尝试更新事务中正在删除的记录

编辑


Tanguy T,但未解决。

我相信您可以检查工作流上下文的ParentContext成员。如果为null或ParentContext的消息不等于Delete-这意味着这不是级联删除。选中。

将您的工作流更改为插件,然后您应该能够使用来确定该信息。只需向父实体添加一个事件前插件,该插件指定这是父级联删除的一部分。然后在子插件中,只需检查该变量是否存在,如果它不存在,您就知道它不是级联。

我结束了

  • 将关系更改为引用关系
  • 添加一个异步工作流,该工作流在子实体的查找更改为其父实体时执行
  • 查找是强制性的
  • 工作流检查字段是否为空,如果为空,则调用下面的自定义工作流活动
此自定义工作流活动删除当前记录:

公共类DeleteCurrentRecord:CodeActivity
{
受保护的覆盖无效执行(CodeActivityContext上下文)
{
if(上下文==null)
{
抛出新的InvalidPluginExecutionException(“工作流上下文错误。请重试该操作”);
}
使用(var workflowContext=newworkflowcontext(context))
{
DeleteRecord(工作流上下文,上下文);
}
}
public void DeleteRecord(WorkflowContext上下文,CodeActivityContext activityContext)
{
var targetId=context.Target!=null?context.Target.Id:context.TargetReference.Id;
var targetName=context.Target!=null?context.Target.LogicalName:context.TargetReference.LogicalName;
context.Service.Delete(targetName,targetId);
}
}
这是我编写的helper类,它从CodeActivityContext获取我所需的一切。
只需为每个工作流编写相同的锅炉铭牌代码即可节省时间。
我还可以在控制台应用程序中构造一个对象,以在本地测试工作流:

/*WorkflowContext是我编写的一个助手类,它获取所有CRM服务
*以及CodeActivityContext中的所有内容
*然后我将它的一个实例传递给方法
*我根据需要向WorkflowContext添加属性
* */
/*包含从CodeActivityContext获取的对象
* */
公共类WorkflowContext:IDisposable
{
公共IOR组织服务服务{get;private set;}
公共实体目标{get;private set;}
public EntityReference TargetReference{get;private set;}
公共上下文Linq{get;private set;}
公共IWorkflowContext CurrentContext{get;set;}
公共字符串PrimaryEntityName{get;set;}
公共整数深度{get;set;}
公共工作流上下文(CodeActivityContext activityContext)
{
IWorkflowContext上下文=activityContext.GetExtension();
CurrentContext=上下文;
PrimaryEntityName=context.PrimaryEntityName;
深度=上下文。深度;
IOOrganizationServiceFactory工厂=activityContext.GetExtension();
if(context.InputParameters.Contains(“Target”)//按需工作流没有目标
{
if(context.InputParameters[“Target”].GetType()==typeof(Entity))
Target=(实体)context.InputParameters[“Target”];
else if(context.InputParameters[“Target”].GetType()==typeof(EntityReference))//删除和其他一些操作是EntityReference
TargetReference=(EntityReference)context.InputParameters[“Target”];
}
服务=factory.CreateOrganizationService(context.initialingUserId);
Linq=新上下文(服务);
}
//测试用建造师
公共工作流上下文(IOOrganizationService服务、上下文linq、EntityReference targetReference、Entity target、bool内部事务)
{
服务=服务;
这个.Linq=Linq;
this.TargetReference=TargetReference;
这个。目标=目标;
}
公共空间处置()
{
Linq.Dispose();
}
}

谢谢您的回答。我尝试了一下,发现父实体的delete和cascade-delete的ParentContext都为null。你能告诉我其他的方向吗?在这种情况下,我建议使用异步插件而不是工作流。共享变量在两个方面都不存在——手动删除记录时(这是预期的),以及通过父级级联删除记录时;两次删除的父上下文也是空的。哦,等等,出于某种原因,我认为这是一个插件。因为这是一个工作流程,所以不起作用@Bvrce,如果你把它改成插件而不是工作流,你就可以使用它了。我可以在IWorkflowContext中定义一个共享变量。我认为它也不会与插件一起工作-Tanguy尝试了一个插件。级联删除似乎存在问题。