Dynamics 365 Web API - создание нескольких дочерних записей JSON?

У нас есть объект под названием Question, который имеет несколько ответов, то есть между объектами Question и Response существует отношение 1: N.

У нас есть существующая запись вопроса. Что нам нужно сделать, так это обновить запись вопроса и в то же время добавить несколько записей ответа, связанных с одним и тем же вопросом (то есть поле new_QuestionId в таблице ответов должно быть заполнено как часть создания ответа).

Моя логика заключалась в том, чтобы

  1. Обновите запись вопроса (т. Е. Одну операцию PATCH).
  2. Имейте циклическую структуру и внутри цикла создайте записи ответа, связанные с записью вопроса.

Образец кода

Итак, здесь я привел образец, в котором мы создаем одну запись ответа, которая связана с Вопросом (с идентификатором записи 4B5461DB-7061-E711-8124-E0071B66C0A1).

POST [Organization URI]/api/data/v8.2/new_responses HTTP/1.1 
Content-Type: application/json; charset=utf-8 
OData-MaxVersion: 4.0 
OData-Version: 4.0 
Accept: application/json
{   
    "new_questionTitle": "This is the question from my console app",  
    "new_score": 100,   
    "new_nativelanguage": "This is in native language",   
    "new_englishtranslation": "This is in english",   
    "[email protected]": "/new_questions(4B5461DB-7061-E711-8124-E0071B66C0A1)",   
    "new_name": "This is the primary attribute" 
}

Мой вопрос: каким будет JSON, если я хочу иметь возможность создавать несколько ответов, все относящиеся к одному и тому же идентификатору вопроса 4B5461DB-7061-E711-8124-E0071B66C0A1

Мы на Dynamics 365 Online.


person Kanini    schedule 12.07.2017    source источник


Ответы (1)


WebAPI может выполнять пакетные запросы, как описано здесь: Выполнение пакетных операций с использованием веб-API

И это сообщение в блоге by Scaleable Solutions содержит следующий пример кода для пакетного создания:

function BulkCreate() {
    var body = "";
    var entityCollection = new Array();

    var entity1 = {};
    entity1["name"] = "dummy account 1";
    var body = JSON.stringify(entity1);
    entityCollection.push(body);

    body = "";
    var entity2 = {};
    entity2["name"] = "dummy account 2";
    body = JSON.stringify(entity2);
    entityCollection.push(body);

    var data = [];
    data.push('--batch_123456');
    data.push('Content-Type: multipart/mixed;boundary=changeset_BBB456');
    data.push('');

    for (var i = 0; i < entityCollection.length; i++) {
        data.push('--changeset_BBB456');
        data.push('Content-Type:application/http');
        data.push('Content-Transfer-Encoding:binary');
        var id = i + 1;
        data.push('Content-ID:' + id);
        data.push('');
        data.push('POST ' + parent.Xrm.Page.context.getClientUrl() + '/api/data/v8.1/accounts HTTP/1.1');

        data.push('Content-Type:application/json;type=entry');
        data.push('');
        data.push(entityCollection[i]);
    }

    data.push('--changeset_BBB456--');
    data.push('--batch_123456--');
    var payload = data.join('\r\n');
    $.ajax(
    {
        method: 'POST',
        url: parent.Xrm.Page.context.getClientUrl() + '/api/data/v8.1/$batch',
        headers: {
            'Content-Type': 'multipart/mixed;boundary=batch_123456',
            'Accept': 'application/json',
            'Odata-MaxVersion': '4.0',
            'Odata-Version': '4.0'
        },
        data: payload,
        async: false,
        success: function (data, textStatus, xhr) {
            alert("Record has been successfully Created");
        },
        error: function (xhr, textStatus, errorThrown) {
            alert(textStatus + " " + errorThrown);
        }
    });
}
person Aron    schedule 12.07.2017
comment
Спасибо! Но пакетные операции явно говорят The value that batch requests provide is that they can include change sets, which provide a way to bundle a number of operations that either succeed or fail as a group. К сожалению, мы этого не хотим. - person Kanini; 21.07.2017