【问题标题】:CRM 2011 Plugin (Message: Delete, Pre-validation) Warning on Multi-DeleteCRM 2011 插件(消息:删除,预验证)多次删除警告
【发布时间】:2012-11-11 02:33:30
【问题描述】:

当我删除 MarketingList(A) 时,我有一个插件可以触发并使用存储在 MarketingList(A) 上的属性中的 Guid 检索另一个 Marketing List(B)。

如果我选择 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();
    }

}

【问题讨论】:

    标签: plugins dynamics-crm-2011


    【解决方案1】:

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

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

    我怀疑网格控件在尝试删除记录之前没有检查记录是否存在。我没想到会这样;它只是得到了一个要删除的东西的列表,假设它们仍然存在似乎是合理的。

    我可以看到几种解决此问题的方法。

    1. 使用工作流删除记录,这样它应该始终在网格完成其工作后运行。
    2. 让您的插件在帖子上异步运行,同样,它应该始终在网格完成工作后运行。
    3. 从网格中删除删除按钮,并添加一个自定义功能区按钮,用于在删除前检查记录是否存在。

    附带说明一下,您是否知道您实现的插件将执行与级联关系相同的行为?如果将关系设置为级联删除,则不需要任何代码。

    【讨论】:

    • 谢谢你,James,我想我会使用你在帖子中提到的 Cascades Deletes 选项。
    • 级联删除可能会遇到同样的问题。我只是指出您正在实现已经存在的逻辑。
    【解决方案2】:

    假设您仅将 B 的 id 字符串存储在 A 的字段 (tph_WitnessMarketingListID) 中。B 可能在 A 之前被删除,因此删除可能失败。尝试调试您的插件以查看它失败的行。

    【讨论】:

    • 感谢您的回复,我调试了,没有异常,警告后删除记录。我同意你的观点,我认为这是 Grid 在尝试删除已删除的内容时的行为。其他建议?
    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 2021-01-16
    • 2010-12-31
    • 2021-03-15
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多