通过ADF将记录加载到Dynamics 365

3
我正在使用Azure Data Factory中的Dynamics连接器。
TLDR:
这个连接器是否支持加载需要传递父记录键的子记录?例如,如果我想创建一个联系人并将其附加到父账户,则可以使用带有空contactid、有效parentcustomerid GUID并将parentcustomeridtype设置为1(或2)的upsert记录,但是出现了错误。
长篇故事:
我成功地连接到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=Cannot find the target column for multi-target lookup field: 'ownerid'。”
作为一个测试,我从要加载的源列列表中删除了“ownerid”,它就能够成功加载了。
这很明显是一个外键值。
它给我带来了两个问题:
1. 特别是关于错误消息:如果我知道它需要使用哪个查找字段,如何指定它应验证哪个查找表? ADF连接器中没有任何设置可以让我这样做。 2. 这很明显是一个外键值。如果我只知道这一行的名称(或业务键),我该如何轻松查找外键值?其他API通常是如何做到的,例如web API? 是否有XRMToolbox插件可以帮助澄清?
另外,我还阅读了一些帖子,暗示你可以发送预连接数据的XML文档,因此可能会有所帮助。
编辑1:
我意识到我的源数据集中的“lead.ownertypeid”字段为NULL(就是导出的内容)。在各种Xrmtoolbox工具中浏览时,它也是NULL。我试过硬编码它为“systemuser”(实际上是在“owner”表中针对实际所有者记录的),但仍然得到相同的错误。
我还注意到,在“systemuser”表中有一个具有相同PK值的记录。
因此,相同的记录在两个表中,但我如何告诉dynamics连接器应该使用哪个?为什么它关心呢?
编辑2:

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

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

编辑 2

此链接显示我需要将 customeridtype 设置为1(帐户)或2(联系人)。 我这样做了,但仍然遇到了同样的错误。

我认为我和这个人有相同的问题。

也许ADF连接器遇到了同样的问题。


ownerid是一个特殊字段,可以引用多个表。这就是为什么有owneridtype的原因,请参见https://learn.microsoft.com/en-us/dynamics365/customer-engagement/web-api/ownershiptypes?view=dynamics-ce-odata-9。 - minohimself
我非常感谢您的回复。错误明确表明需要更多信息来消除歧义。然而,ADF动态连接器似乎不允许这样做。 - Nick.McDermaid
我会创建微软工单。也许这是一个“特性”。 - minohimself
我认为这更多是缺乏功能。我开始意识到动态集成比加载表格要复杂得多。我认为ADF连接器的功能不足以发挥任何作用。 - Nick.McDermaid
2个回答

5
在写这篇文章时,@Arun Vinoth是100%正确的。然而不久之后,由于我提出的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中。你可以应用通常的自动映射方法,即:创建没有模式的数据集。执行不带映射列的复制活动。

1
现在只要有一种方法可以使用指向替代键而不是父记录GUID的EntityReferences就好了... - Oliver Rahner
我现在正在尝试使用替代键。我已经发了一个 GitHub 因为它返回一个错误。 - Nick.McDermaid
1
如果有人感兴趣的话,我建立了一个进程,简单地将整个表格拉回到数据库中,这样你就可以通过备用键加入到该表格中,以查找内部GUID。CDS连接器可以很快地拉回数据(特别是当它只涉及关键列时)。 - Nick.McDermaid
1
@Nick.NcDermaid 这正是我所做的... 此外,在Azure反馈中有一个功能请求:https://feedback.azure.com/forums/270578-data-factory/suggestions/40687474-common-data-service-connector-alternate-key-suppo - Oliver Rahner
如果我能弄清楚如何登录,我肯定会投票支持的:/ - Nick.McDermaid
显示剩余3条评论

2
这是关于CDS多态查找(如Customer和Owner)的ADF限制。点赞此ADF想法 解决方法是使用两个临时源查找字段(所有者团队和用户,如果是所有者,则为帐户和联系人),并使用MS Flow中的并行分支来解决此问题。阅读更多,同时您可以下载Flow示例进行使用。
首先,在您希望导入客户查找数据的实体上创建两个临时查找字段,分别对应于账户和联系人实体。
在ADF管道流程中,您需要将账户和联系人字段的GUID值映射到上述各自的查找字段。最简单的方法是在源数据集中有两个独立的列 - 一个包含要映射的账户GUID,另一个包含联系人。
最后,您可以组合一个Microsoft Flow,将临时字段的值映射到客户查找字段。首先定义触发器点,即受影响的实体记录何时被创建(在本例中为联系人),并添加一些并行分支来检查这两个临时查找字段中的值。

enter image description here

那么,如果满足以下任一条件,则设置一个“更新记录”任务以执行单个字段更新,如下所示,如果ADF Account Lookup字段中有数据:

非常感谢您的回复。我已在文档页面上提出了一个Github请求,以明确指出这个连接器基本上无法用于核心CDM实体,如联系人。我在这上面浪费了很多时间,现在我需要找到一种新的方法。 - Nick.McDermaid
@Nick.McDermaid,大多数情况下,MS文档需要进行改进。在这种情况下,它可以比文档中提到的“使用单个目标相关”更详细地展示查询数据类型映射:https://learn.microsoft.com/en-us/azure/data-factory/connector-dynamics-crm-office-365#data-type-mapping-for-dynamics - Arun Vinoth-Precog Tech - MVP
同意 - 从技术上讲,它确实指出了它不受支持,但我认为,考虑到微软对CDM和CDS的所有炒作,应该更明显地表明连接器不支持像联系人这样的核心实体的更新操作。再次感谢您的帮助,这意味着我可以停止追逐这个选项并尝试其他方法。 - Nick.McDermaid
1
我的同事发现了这个链接 https://learn.microsoft.com/en-us/azure/data-factory/connector-dynamics-crm-office-365#writing-data-to-lookup-field ,看起来表明这是可能的。我明天会测试它。 - Nick.McDermaid
@Nick.McDermaid 我相信这是我之前分享的同一个链接,可能是在你提交 GitHub 问题后微软进行了更新。 - Arun Vinoth-Precog Tech - MVP
1
是的,你说得对,我没有意识到 - 它是相同的链接,是的,他们刚刚更新了它 - 我可以在文档提交中看到! - Nick.McDermaid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接