2012-11-09 76 views
2

当我删除MarketingList(A)时,我有一个插件使用存储在属性中的Guid触发并检索另一个Marketing List(B) MarketingList(A)。CRM 2011插件(消息:删除,预验证)多删除警告

如果我选择MarketingList(A)并将其删除,则会正确删除MarketingList(B)。但是,当我同时选择(A & B)或网格上的所有记录时,我有一个警告: “发生了错误。所选操作未完成一个或多个记录”。 警告后,记录被删除。

任何帮助表示赞赏!

插件:

Message: **Delete**<br> 
PrimaryEntity: **list**<br> 
Stage of Execution: **Pre-Validation**. 

代码:

if (context.MessageName == "Delete") 
{ 
    using (var crm = new XrmServiceContext(service)) 
    { 
     List listToDelete = crm.ListSet.Where(p => p.Id == context.PrimaryEntityId).SingleOrDefault(); 
     List retrievedList = crm.ListSet.Where(p => p.Id == new Guid(listToDelete.tph_WitnessMarketingListID)).SingleOrDefault(); 
     if (retrievedList == null) return; 
     crm.DeleteObject(retrievedList); 
     crm.SaveChanges(); 
    } 

}

回答

0

假设你只保存B的ID的字符串A.它可能的领域(tph_WitnessMarketingListID)有可能B在A之前被删除,因此删除可能失败。尝试调试您的插件以查看其失败的行。

+0

感谢您的回复,我调试过,没有例外,记录在警告后被删除。我同意你的观点,我认为这是网格在试图删除已删除内容时的行为。其他建议? – user944543

1

我不确定你是否能够避免这种情况(至少在你目前的设计中)。

我相信你是正确的问题是网格试图删除已被删除的东西。

我怀疑网格控件在试图删除它之前没有检查记录是否存在。我不期望它;刚刚给出了要删除的东西清单,假设它们仍然存在似乎是合理的。

我可以看到几种方法来解决这个问题。

  1. 使用工作流删除记录,这种方式应该始终在网格完成工作后运行。
  2. 让你的插件在帖子上异步运行,这种方式应该总是在网格完成工作后运行。
  3. 从网格中删除删除按钮,并添加一个具有行为的自定义功能区按钮,以在删除之前检查记录是否存在。

作为一个方面说明,你知道你已经实现的插件将执行与级联关系相同的行为吗?如果您将关系设置为级联删除,则不需要任何代码。

+0

谢谢詹姆斯,我想我会和您在帖子中提到的Cascades Deletes选项一起使用。 – user944543

+0

级联删除可能会遇到同样的问题。我只是指出你正在实现已经存在的逻辑。 –

+0

好的,我明白了你的意思,谢谢! – user944543