Dynamics CRM SDK: Пакетное обновление определенных полей в объекте

Я новичок в разработке Dynamics CRM. Я хочу выполнить пакетное обновление определенных полей в Entity с помощью метода пакетного обновления в Dynamics CRM Online. Я использую код ниже для выполнения пакетного обновления:

var multipleRequest = new ExecuteMultipleRequest()
{
    Settings = new ExecuteMultipleSettings()
    {
        ContinueOnError = false,
        ReturnResponses = true
    },
    Requests = new OrganizationRequestCollection()
};

foreach (var entity in entities.Entities)
{
    UpdateRequest updateRequest = new UpdateRequest { Target = entity };
    multipleRequest.Requests.Add(updateRequest);
}

ExecuteMultipleResponse multipleResponse = (ExecuteMultipleResponse)service.Execute(multipleRequest);

Как я могу указать только те поля, которые я хочу обновить, вместо того, чтобы обновлять всю сущность?

Примечание: у меня есть около 200 000 записей для обновления с использованием вышеуказанного кода. В настоящее время требуется около 1,5 минут для обновления одной партии из 1000 записей. Поэтому подумывал, как обновить только обязательные поля.

3 ответа

Решение

Вы должны посмотреть на то, как EntityCollection entities заполнен. При извлечении с использованием RetrieveMultiple, тогда поле Pull the минимальное может быть собственным полем Name, а поле PK Id появится по умолчанию. Таким образом, не вся сущность будет обновлена ​​обратно.

Избегать использования AllColumns = true, Используйте ColumnSet, чтобы получить минимальные поля, необходимые для проверки.

ColumnSet = new ColumnSet("field_needed"),

Затем назначьте только необходимые поля, как показано ниже в цикле.

foreach (var entity in entities.Entities)
    {
        UpdateRequest updateRequest = new UpdateRequest { Target = entity };

        entity.Attributes[“field_to_update”] = “field_value”;

        multipleRequest.Requests.Add(updateRequest);
    }

Мой ответ поможет вам понять, что пошло не так и исправить это. Как сказал Никнау, вы можете назначить новую сущность для решения проблемы.

Мой рекомендуемый подход заключается в создании new Entity() объект для обновления. Таким образом, ваш код обновления не должен беспокоиться о том, какие поля были извлечены, он просто берет те, которые ему нужны для обновления.

foreach (var entity in entities.Entities)
{
    var newEntity = new Entity(entity.LogicalName, entity.Id);

    //Populate whatever fields you want (this is just an example)
    newEntity["new_somefield"] = entity.GetAttributeValue<string>("new_somefield").ToUpper();

    UpdateRequest updateRequest = new UpdateRequest { Target = newEntity };
    multipleRequest.Requests.Add(updateRequest);
}

Невозможно обновить только поля без обновления Entity. Таким образом, даже для обновления одного поля вам необходимо создать сущность сIdи установите значение атрибута, а затем создайте настройку объекта какTargetа затем после обновленияmodifiedonдата меняется на время обновления.

В других ответах уже есть коды, рассказывающие, как это создать, но вы также можете сделатьEntity.Attributes.Add("name", "vinod");чтобы добавить новое значение поля. В вашем случае, поскольку это обновление, у вас, вероятно, есть объект сущности, поэтому вы можете просто попытаться удалить другие поля какEntity.Attributes.Remove("name");если вы не установили фильтр при получении и у вас есть все поля.

Чтобы обновить несколько записей, вам просто нужно иметьEntity.LogicalNameи значения полей обновления и отправьте их вUpdateRequest. и обратите внимание, безEntity.Idон попытается его создать.

Но 200 000 записей — это слишком много, и я не буду предлагать использовать API, а импортировать данные Excel, поскольку он предназначен для импорта данных.

Другие вопросы по тегам