【问题标题】:Plugin performance in Microsoft Dynamics CRM 2013/2015Microsoft Dynamics CRM 2013/2015 中的插件性能
【发布时间】:2015-06-17 16:47:26
【问题描述】:

是时候摆脱害羞模式并在 stackoverflow 上发表我的第一篇文章了。 在进行了大量研究(插件、性能、索引、更新类型、朋友)并尝试了几种方法之后,我无法找到合适的答案/解决方案。

因此,如果可能的话,我想在 Microsoft Dynamics CRM 2013/2015 插件性能问题(或编码技术)方面获得您的反馈/帮助

场景:

Microsoft Dynamics CRM 2013/2015
2 个关系为 1:N 的实体
实体A
实体B

EntityB 具有以下列:
身份证 |实体 ID | ColumnDemoX (十进制) | ColumnDemoY(货币)

实体 A 有:500 条记录
实体 B 有: 每个实体 A 记录 150 条记录。所以 500*150 = 75000 条记录。

目标:

创建一个 Post Entity A 插件更新以“模仿”以下 SQL 命令

Update EntityB
Set ColumnDemoX = (some quantity), ColumnDemoY = (some quantity) * (some value)
Where EntityAId = (some id)

一种方法可能是:

using (var serviceContext = new XrmServiceContext(service)) 
{
  var query = from a in serviceContext.EntityASet
              where a.EntityAId.Equals(someId)
              select a;

  foreach (EntityA entA in query)
  {
    entA.ColumnDemoX = (some quantity);
    serviceContext.UpdateObject(entA);
  }

  serviceContext.SaveChanges();
}

问题:

帖子插件更新中 150 条记录的 foreach 将需要 20 秒或更长时间
虽然
更新 EntityB 设置 ColumnDemoX = (一些数量), ColumnDemoY = (一些数量) * (一些值) 其中 EntityAId = (一些 id)
这将需要 0.00001

有什么建议/解决方案吗?


谢谢大家的阅读。
H

【问题讨论】:

    标签: performance plugins dynamics-crm dynamics-crm-2013 dynamics-crm-2015


    【解决方案1】:

    您可以使用ExecuteMultipleRequest,当您迭代 150 个实体时,保存您需要更新的实体,然后调用请求。如果你这样做,你只调用一次服务,这对性能非常好。

    如果您的流程可以越来越大,那么您应该考虑将其作为插件或自定义活动工作流异步。

    这是一个例子:

    // Create an ExecuteMultipleRequest object.
    requestWithResults = new ExecuteMultipleRequest()
    {
        // Assign settings that define execution behavior: continue on error, return responses. 
        Settings = new ExecuteMultipleSettings()
        {
            ContinueOnError = false,
            ReturnResponses = true
        },
        // Create an empty organization request collection.
        Requests = new OrganizationRequestCollection()
    };
    
    // Add a UpdateRequest for each entity to the request collection.
    foreach (var entity in input.Entities)
    {
        UpdateRequest updateRequest = new UpdateRequest { Target = entity };
        requestWithResults.Requests.Add(updateRequest);
    }
    
    // Execute all the requests in the request collection using a single web method call.
    ExecuteMultipleResponse responseWithResults =
        (ExecuteMultipleResponse)_serviceProxy.Execute(requestWithResults);
    

    【讨论】:

    • 能否请您查看此线程link 简短摘要:因此,从这些结果来看,无需在插件中执行 ExecuteMultipleRequest。您已经在服务器上,必须执行更多代码才能执行相同的操作。谢谢Sxntk的回复
    • 注意:对上一条评论的多次编辑表示歉意,但我只是同时阅读了 stackoverflow Markdown 帮助:)
    • 这很有趣,谢谢分享,我的想法是你应该自己尝试,创建和更新可能会改变它的行为,你自己试试看结果。
    • 经过一些测试,我可以确认link 中的理论是正确的。在插件中使用 executemultiplerequest 没有好处,实际上会增加更多时间。
    • 是否可以使该过程异步?
    【解决方案2】:

    想到的解决方案很少,但我认为它们不会让您满意...

    1. 这真的是个问题吗?是的,它很慢,而且数据库更新可以快得多。但是,如果您可以将其作为后台进程(异步),那么无论如何您都会拥有您的号码。真的是“我一点击就需要这个数字,不然生意就垮了”的情况吗?

    2. 这可能是放弃 2013 的一个原因。在 CRM 2015 中,您可以使用 calculated field。如果您只需要在表单中显示这些数字(例如,您不在报告中使用它们),您也可以在 javascript 中进行。

    3. 警告这是给绝望的电话。如果你真的需要你的更新是同步的,即时的,你不能使用计算字段,你真的知道你在做什么等等......为什么不直接在数据库中做呢?我知道这是一个非常糟糕的建议。有很多理由不这样做(你可以阅读a few here)。它不受支持,如果你做错了什么,它可能会变得非常糟糕。但是如果你的实际情况和你的例子一样简单(只是一个计算字段,没有实体创建,没有关系修改),你可以这样做。您必须考虑很多事情:您不会对字段进行任何审核,没有安全性,缓存问题,没有修改者等。实际上我非常建议不要使用此解决方案。

    【讨论】:

    • 1.是的,从用户的角度来看,这是一个问题。简单的要求:更改表单上的某些内容,按“确认/保存/执行”,这应该更新相关记录,以便用户现在可以更新包含相关信息的网格。我现在有 2 个插件(一个同步和另一个异步),但如果您知道我的意思,这是最好的非理想解决方案。

      2. CRM中的计算字段。您不能在引用相关实体的计算属性中使用值,所以我猜它不起作用。请记住,当 EntityA 上的 Field1 更新时,我正在尝试更新 EntityB。
    • 3.是的,我知道我在做什么,我知道绕过 CRM API 会造成什么损失,但我倾向于找到支持的解决方法,更改业务需求逻辑或向客户解释软件限制。
      Nicolas 非常感谢您的帮助。真的很感激。
    【解决方案3】:

    1 - 将此逻辑用于异步工作流程。 或者 2 - 不要使用
    serviceContext.UpdateObject(entA);

    serviceContext.SaveChanges();.

    从后期更新字段和ExecuteMultipleRequest获取所有记录(150)以一次更新crm记录。 不要为每条记录发送更新请求

    【讨论】:

    • 这是拆分代码的决定,但它并没有真正实现所需的功能。
      我尝试了批量更新和 ExecuteMultipleRequest,但问题仍然存在。将我的 cmets 阅读到 Sxntk 并检查指向另一个 Stackoverflow 线程的链接,他们在其中详细介绍了所有测试,包括您建议的测试。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多