2

我是 Dynamics CRM Online 编程的新手,在更新已部署的插件时遇到问题。我使用 Visual Studio 2012 作为我的 IDE。我部署了一个需要修改的插件,当我通过 VS 重新部署它时,CRM 中的修改日期是正确的,但更改不存在。这是我的代码..

if (context.InputParameters.Contains("Target") 
  && context.InputParameters["Target"] is Entity)
{
  Entity entity = (Entity)context.InputParameters["Target"];
  if (entity.LogicalName == "lead")
  {
    if (entity.Attributes.Contains("companyname") == true)
    {
      if (entity["firstname"].ToString() != "null")
        firstName = entity["firstname"].ToString();
      else
        firstName = "";

      if (entity["lastname"].ToString() != "null")
        lastName = entity["lastName"].ToString();
      else
        lastName = "";

      entity["companyName"] = "This is a test";
      //entity["companyname"] = firstName + " " + lastName;
    }
    else
      throw new InvalidPluginExecutionException(
        "The company name can only be set by the system.");
  }
}

当我创建潜在客户时,公司名称不是“这是一个测试”。我不确定我做错了什么。

谢谢您的帮助!

4

1 回答 1

3

您通过以下方式检测具有公司名称的字段是否存在:

if (entity.Attributes.Contains("companyname") == true)

但你写信给另一个人,即:

entity["companyName"] = "This is a test";

该值被放入实体中,但由于它在元数据中没有对应项,因此没有被存储。将字段名称设置为模式名称,即小写。


如果您遇到其他错误,还需要考虑其他一些事项。

  • 设置字段值后,您需要在服务上调用Update方法。
  • 该字段应该有某种前缀(例如new_somethingbeep_something)。
  • 骆驼大小写在这里不适用(模式名称是),所以去alltolowercase

你得到的公司名称是什么你得到抛出的异常吗?


此外,还有一些关于代码质量的指示。我已经重建了逻辑以消除不必要的范围复杂性。我删除了多余的else语句和与true的比较。我还建议您将流程拆分为不同的方法,但我相信您已经掌握了这一点。您可能希望使用辅助方法从字段中获取值。请参阅我的建议在这篇文章中

if (!context.InputParameters.Contains("Target") ||
  context.InputParameters["Target"] is Entity)
  return;

Entity entity = context.InputParameters["Target"] as Entity;
if (entity.LogicalName != "lead")
  return;
if (!entity.Attributes.Contains("companyname"))
  throw new InvalidPluginExecutionException(
    "The company name can only be set by the system.");

String firstName = String.Empty;
if (entity.Contains("firstname"))
  firstName = entity["firstname"] as String;

String lastName = String.Empty;
if (entity.Contains("lastname"))
  lastName = entity["lastname"] as String;

entity["companyname"] = "This is a test";
//entity["companyname"] = firstName + " " + lastName;

编辑:

如果您仍然没有得到请求的行为,请尝试以下操作。(我不确定你的专业水平如何,如果你因为我提到一些你已经尝试过无数次的非常基本的东西而感到侮辱,请接受我的道歉。)

技术技巧。

  1. 发布所有自定义(我经常这样做以防万一)。
  2. 点击F5重新加载。
  3. 登录/注销。
  4. 重新启动 IIS(如果在本地)。
  5. 取消注册插件,看看行为是否仍然存在。然后重新注册。
  6. 检查被遗忘的工作流程是否正在运行。

可能会有一些延迟和滞后。有一次,我实际上同时触发了旧版本和新版本的插件,这取决于我是从Settings还是Workplace创建记录。这很奇怪,但几个小时后就自行解决了。严重地。很奇怪!

程序化技巧。

  1. 检查是否有您可能忘记停用的其他插件。
  2. 删除所有线索并确保插件在创建新线索时触发。
  3. 将文本更改为例如I'm a giant moose,以确保更改通过。
  4. 删除所有代码(或将return放在Execute的开头。然后,逐步将其向下移动以检测怪异何时开始。

在您所展示的内容中,它应该可以正常工作,因此要么您没有提及相关内容(当然,我们感谢您没有发布 100000 行代码),要么是 CRM 很奇怪(这同样令人讨厌和令人困惑)。所以,让我们解决这个问题。当您尝试上述技巧时会发生什么?

至于代码存根,是的——我对微软在那里的努力并不感到太自豪。尝试在Programmers上的 C# 标签下发布该代码以进行代码审查。为愤怒的讨论做好准备。:)

于 2013-02-26T22:35:20.063 回答