2012-10-22 103 views
1

我正在使用一个插件,在删除实体之前应该检查某些前置条件是否属实。如果它是假的,我会抛出InvaludPluginExecutionException。这工作得很好,但我的问题是,我有一个其他插件处理更新的实体,当然一些条件是真实的,并删除链接的实体。 您必须明白在帐户实体中存在一个AccountGroups实体列表。 更新插件关心只有一个被标记为主要的AccountGroup实体。 如果为该帐户添加新的AccountGroup实体,该插件将删除旧的标记为主要的AccountGroup实体,并将新的AccountGroup实体添加为主要实体。 在这种情况下,Update Plugin触发Pre Delete Plugin并取消删除步骤。 此外InvalidExecutionException被抛出。Pre删除失败,更新实体CRM 2011

有没有什么方法可以找出插件在哪里触发?例如。更新插件触发删除呼叫,不应执行预删除插件?或者还有其他方法吗?

代码预删除插件的:

[OnPreDelete] 
public void PreventDeletion(IServiceProvider serviceProvider){ 

    var pluginServiceFactory = new PluginServiceFactory(serviceProvider); 
    var targetAccount = pluginServiceFactory.Context.GetTargetEntityReference(); 



    using (var context = new DataContext(pluginServiceFactory.OrganizationService)) 
    { 
     var acgr = (from ac in context.im_customergroupSet 
        where ac.Id == targetAccount.Id 
        select ac).FirstOrDefault(); 


     if (acgr.im_Primary == true) 
     { 
      throw new InvalidPluginExecutionException("Primary Account Groups can not be deleted!"); 
     } 
    }    
} 

回答

1

您可能能够通过使用SharedVariables采集插件之间传递数据解决这个问题,看到MSDN。我相信这应该可以让你的Update插件将一些标志添加到删除插件可以读取的SharedVariables中,然后你可以从中驱动你的逻辑(例如,如果标志被设置,不要停止删除记录) 。

+0

我使用context.depth属性解决了问题。这是为了防止crm插件中的递归调用。 – ICantSeeSharp

+0

哦,对,我不明白这是你原来的问题的问题。 –

+0

是的,我可以形容它不是,但没有问题:) – ICantSeeSharp