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, поскольку он предназначен для импорта данных.