使用Xrm.WebApi为单值导航属性设置null

时间:2018-03-16 21:33:51

标签: dynamics-crm microsoft-dynamics dynamics-crm-online dynamics-crm-webapi dynamics-crm-365-v9

我们正在进行补救,重新设计旧的JS网络资源以用于最新的D365 v9 sdk更改w.r.t客户端脚本API改进&弃用。

使用Xrm.WebApi重写网络api方法时,我们最终会使用此拦截器。

方案是将null设置为查找,并尝试以下代码:

var data = {
    "abc_relatedentity@odata.bind": null
};

Xrm.WebApi.updateRecord("abc_entity", abc_entityid, data).then(successCallback, errorCallback);

这是抛出错误:

  

"' odata.bind'实例或属性注释具有空值。在OData中,' odata.bind'实例或属性注释必须具有非空字符串值。"

我们的想法是淘汰以下冗余的XHR请求代码。但这是我们现在唯一的解决方法(引用MSDN)。

var req = new XMLHttpRequest();
req.open("DELETE", Xrm.Utility.getGlobalContext().getClientUrl() + "/api/data/v9.0/accounts(recordGUID)/account_parent_account/$ref", true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 204 || this.status === 1223) {
            //Success - No Return Data - Do Something
        } 
    }
};
req.send();

任何人都面对这个&处理了吗?我错过了什么吗?

6 个答案:

答案 0 :(得分:1)

您必须使用Delete方法删除查找值 格式如下: /api/data/v8.0/accounts(1DD18913-11CB-E511-80D2-C4346BDC11C1)/ primarycontactid / $ ref

答案 1 :(得分:0)

要在查找使用上设置null:

var data = { _[LookupFieldName]_value : null } 
Xrm.WebApi.updateRecord("abc_entity", abc_entityid, data).then(successCallback, errorCallback

例如,要删除您需要使用的contact.parentcustomerid字段值:

var data = {};
data._parentcustomerid_value = null
var t = await Xrm.WebApi.updateRecord("contact", "{0200E6F5-1D21-E811-A954-0022480042B3}", data)

答案 2 :(得分:0)

我刚刚在v9.1.0.3832中尝试过 ignore-dependencies正在为我工​​作。

var data = { _[LookupFieldName]_value : null }

答案 3 :(得分:0)

您应该尝试 Xrm.WebApi.online.execute 或 Xrm.WebApi.online.executeMultiple

var Sdk = window.Sdk || {};


/**
 * Request to execute an update operation
 */
Sdk.UpdateRequest = function(entityName, entityId, payload) {
    this.etn = entityName;
    this.id = entityId;
    this.payload = payload;
};

// NOTE: The getMetadata property should be attached to the function prototype instead of the
// function object itself.
Sdk.UpdateRequest.prototype.getMetadata = function () {
    return {
        boundParameter: null,
        parameterTypes: {},
        operationType: 2, // This is a CRUD operation. Use '0' for actions and '1' for functions
        operationName: "Update",
    };
};

// Construct a request object from the metadata
var payload = {
    "_abc_relatedentity_value": null 
};
var updateRequest = new Sdk.UpdateRequest("abc_entity", abc_entityid, payload);

// Use the request object to execute the function
Xrm.WebApi.online.execute(updateRequest).then(
    function (response) {
       console.log(response)
    },
    function(error) {
        console.log(error.message);
        // handle error conditions
    }
);

答案 4 :(得分:0)

我认为将列设置为 null 就足够了,请确保您删除了 '@odata.bind'

var 数据 = { “abc_relatedentity”:空 };

这对我有用。

答案 5 :(得分:-1)

好消息!您可以通过将此标头添加到您的请求中,将null请求中的PATCH设置为查找字段。

autodisassociate: true

然后您可以使用类似的方法以任何方式更改您的查找字段:

SetLookupField(requestBody, "systemusers", "msdfm_MyUser", null)
// Or
SetLookupField(requestBody, "systemusers", "msdfm_MyUser", "f5b0b514-aea8-ea11-a812-000d3a569fe1")

// ...

private static void SetLookupField(JObject requestBody, string typePlural, string name, string value)
{
    if (!string.IsNullOrEmpty(value))
    {
        requestBody.Add($"{name}@odata.bind", $"/{typePlural}({value})");
    }
    else
    {
        requestBody.Add($"_{name.ToLower()}_value", null);
    }
}

OP无论如何都使用XMLHttpRequest,所以我认为,使用PATCH进行此操作的方法在这里很重要。