通过 ADF 将记录加载到 Dynamics 365

Loading records into Dynamics 365 through ADF

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

TLDR

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

说来话长

我已成功连接到 Dynamics 365 并将数据(例如 lead table)提取到 SQL 服务器 table

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

我收到这个错误:

Failure happened on 'Sink' side. ErrorCode=DynamicsMissingTargetForMultiTargetLookupField,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=,Source=,''Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Cannot find the target column for multi-target lookup field: 'ownerid'.

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

这显然是一个外键值。

它给我提出了两个问题:

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

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

这通常是如何通过其他 API 完成的,即网络 API?

是否有有助于澄清的 XRMToolbox 插件?

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

编辑 1

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

我还注意到 systemuser table

中有一条具有相同 PK 值的记录

所以同一条记录在两个 table 中,但是我如何告诉动态连接器使用哪一个?为什么它甚至关心?

编辑 2

我在 msauto_testdrive customerid 收到了类似的消息。

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

编辑 2

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

我也相信我有same issue as this guy

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

这是 ADF 对 CDS 多态查找(如 Customer 和 Owner)的限制。 Upvote this ADF idea

解决方法是使用两个临时源查找字段(在所有者的情况下为所有者团队和用户,在客户的情况下为帐户和联系人)并在 MS Flow 中使用并行分支来解决此问题。 Read more, also you can download the Flow sample 使用。

  • First, create two temporary lookup fields on the entity that you wish to import Customer lookup data into it, to both the Account and Contact entities respectively
  • Within your ADF pipeline flow, you will then need to map the GUID values for your Account and Contact fields to the respective lookup fields created above. The simplest way of doing this is to have two separate columns within your source dataset – one containing Account GUID’s to map and the other, Contact.
  • Then, finally, you can put together a Microsoft Flow that then performs the appropriate mapping from the temporary fields to the Customer lookup field. First, define the trigger point for when your affected Entity record is created (in this case, Contact) and add on some parallel branches to check for values in either of these two temporary lookup fields

  • Then, if either of these conditions is hit, set up an Update record task to perform a single field update, as indicated below if the ADF Account Lookup field has data within it

在撰写本文时,@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 中应用正常的自动映射方法。

现在您可以从该数据集 select 加载到 contact。您可以应用通常的自动映射方法,即:创建没有模式的数据集。执行复制 activity 而不映射列