【问题标题】:Loading records into Dynamics 365 through ADF通过 ADF 将记录加载到 Dynamics 365
【发布时间】:2020-09-15 04:00:34
【问题描述】:

我在 Azure 数据工厂中使用 Dynamics 连接器。

TLDR

此连接器是否支持加载需要传入父记录键的子记录?例如,如果我想创建一个 contact 并将其附加到父 account,我将插入一条带有空 contactid 的记录,一个有效的 parentcustomerid GUID 并将 parentcustomeridtype 设置为 1(或 2)但是我收到一个错误。

长篇大论

我已成功连接到 Dynamics 365 并将数据(例如,lead 表)提取到 SQL Server 表中

为了测试我是否可以通过其他方式传输数据,我只是将数据从 lead 表加载回 Dynamics 中的 lead 实体。

我收到此错误:

“Sink”端发生故障。 ErrorCode=DynamicsMissingTargetForMultiTargetLookupField,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=,Source=,''Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=找不到多目标查找字段的目标列: 'ownerid'。

作为测试,我从它加载正常的源列列表中删除了ownerid

这显然是一个外键值。

这给我提出了两个问题:

  1. 特别是关于错误消息:如果我知道它需要使用哪个查找,我如何指定它应该验证哪个查找表? ADF 连接器中没有允许我执行此操作的设置。

  2. 这显然是一个外键值。如果我只有这一行的名称(或业务键),如何轻松查找外键值?

这通常如何通过其他 API 完成,例如 Web API?

是否有 XRMToolbox 插件可以帮助澄清?

我还阅读了一些帖子,暗示您可以在 XML 文档中发送预先连接的数据,所以也许这也会有所帮助。

编辑 1

我意识到我的源数据集中的lead.ownertypeid 字段是NULL(这就是导出的内容)。如果我在各种 Xrmtoolbox 工具中浏览它,它也是 NULL。我尝试将其硬编码为systemuser(这实际上是在owner 表中针对实际所有者记录的内容),但我仍然遇到同样的错误。

我还注意到systemuser 表中有一条具有相同 PK 值的记录

所以相同的记录在两个表中,但是我如何告诉动态连接器使用哪一个呢?为什么它甚至在乎?

编辑 2

msauto_testdrivecustomerid 收到了类似的消息。

我排除了所有带有customerid=null 的记录,得到了同样的错误。

编辑 2

This link 似乎表明我需要将customeridtype 设置为 1(帐户)或 2(联系人)。我这样做了,但仍然遇到同样的错误。

我也相信我有same issue as this guy

也许 ADF 连接器也有同样的问题。

【问题讨论】:

  • ownerid 是特殊字段,可以引用多个表。这就是为什么有 owneridtype 见docs.microsoft.com/en-us/dynamics365/customer-engagement/…
  • 非常感谢您的回复。该错误肯定表明它需要更多信息来消除歧义。不过,ADF 动态连接器似乎不允许这样做。
  • 我会创建微软票证。也许它是一个“功能”
  • 我认为更多的是缺乏功能。我开始意识到动态集成比加载表要复杂得多。我不认为 ADF 连接器的功能足以有任何用途。

标签: dynamics-crm azure-data-factory common-data-service xrmtoolbox


【解决方案1】:

这是针对客户和所有者等 CDS 多态查找的 ADF 限制。 Upvote this ADF idea

解决方法是使用两个临时源查找字段(所有者团队和用户,如果是所有者,帐户和联系人,如果是客户)并在 MS Flow 中使用并行分支来解决此问题。 Read more,也可以download the Flow sample使用。

  • 首先,在您希望将客户查找数据导入其中的实体上创建两个临时查找字段,分别到 Account 和 Contact 实体
  • 在您的 ADF 管道流程中,您需要将您的客户和联系人字段的 GUID 值映射到上面创建的相应查找字段。最简单的方法是在源数据集中有两个单独的列——一个包含要映射的帐户 GUID,另一个包含联系人。
  • 然后,最后,您可以组合一个 Microsoft Flow,然后执行从临时字段到客户查找字段的适当映射。首先,定义创建受影响实体记录(在本例中为联系人)的触发点,并添加一些并行分支以检查这两个临时查找字段中的任何一个中的值

  • 然后,如果满足这些条件之一,则设置更新记录任务以执行单个字段更新,如下所示,如果 ADF 帐户查找字段中包含数据

【讨论】:

  • 非常感谢您的回复。我在 doco 页面上提出了一个 github 请求,以明确表示此连接器对于像 contact 这样的核心 CDM 实体基本上是不可用的。我在这方面浪费了很多时间,现在我需要找到一种新方法。
  • @Nick.McDermaid,MS 文档大部分时间都需要改进。在这种情况下,它可以比文档中提到的“与单个目标关联”的查找数据类型映射更详细:docs.microsoft.com/en-us/azure/data-factory/…
  • 同意 - 从技术上讲,它确实指出它不受支持,但我认为这是合理的,考虑到所有关于 CDM 和 CDS 的 MS 炒作,应该更明显的是连接器不支持 upserting核心实体,如联系人。再次感谢您的帮助,这意味着我可以停止追逐这个选项并尝试其他方法。
  • 我的同事发现了这个链接docs.microsoft.com/en-us/azure/data-factory/…,这似乎表明它是可能的。我明天会测试它
  • 是的,你是对的,我没有意识到 - 这是同一个链接,是的,他们刚刚更新了它 - 我可以在文档提交中看到!
【解决方案2】:

在撰写本文时,@Arun Vinoth 是 100% 正确的。然而不久之后有一个 documentation 更新(作为对我提出的 GitHub 的回应)解释了如何做到这一点。

我将在这里记录我是如何做到的。

要根据父帐户填充联系人,您需要父帐户 GUID。然后你准备一个这样的数据集:

SELECT 
-- a NULL contactid means this is a new record
CAST(NULL as uniqueidentifier) as contactid,
-- the GUID of the parent account
CAST('A7070AE2-D7A6-EA11-A812-000D3A79983B' as uniqueidentifier) parentcustomerid,
-- customer id is an account
'account' [parentcustomerid@EntityReference],
'Joe' as firstname,
'Bloggs' lastname,

现在您可以在 ADF 中应用正常的自动映射方法。

现在您可以从此数据集中进行选择并加载到contact。您可以应用通常的自动映射方法,即:创建没有模式的数据集。在不映射列的情况下执行复制活动

【讨论】:

  • 现在,如果只有一种方法可以使用指向备用键而不是父记录的 GUID 的 EntityReferences...
  • 我现在正在尝试使用备用键。我提出了一个 GitHub,因为它返回一个错误。
  • @OliverRahner 我现在正在尝试这样做。我在 github 上提出了这个文档,但我也会在这里和 Q&A github.com/MicrosoftDocs/azure-docs/issues/59028 上提出一个问题,如果您遇到同样的问题,我们将不胜感激。
  • 如果有人感兴趣。我构建了一个过程,它只是将整个表拉回数据库,以便您可以在备用键上加入该表以查找内部 GUID。 CDS 连接器非常快地拉回数据(尤其是当它只是关键列时)
  • @Nick.NcDermaid 这正是我所做的......此外,Azure 反馈中有一个功能请求:feedback.azure.com/forums/270578-data-factory/suggestions/…
猜你喜欢
  • 2021-05-23
  • 2019-08-12
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多