Статья изначально была написана для habrahabr и долго пылилась в Draft, так как не хватает кармы для ее опубликования. Решил, что опубликую ее здесь ;-)
Работаю с CRM и столкнулся с такой тривиальной задачей, как обновить Owner свойтство у сущности.
Со всеми сущностями я работаю через CRM4SDK и всю манипуляцию произвожу с помощью DynamicEntity.
Например создать сущность с Owner, отличающимся от CurrentUser (учетная запись под которой работает мой application) не составляет труда (здесь правильнее сказать, так же как и привычная работа с CRM):
//Создаем саму сущность DynamicEntity entity = new DynamicEntity(); entity.Name = entityName; // это может быть например "contact" как в моем случае entity.Properties = properties; // коллекция свойств, одно из которых OwnerProperty //Создаем запрос TargetCreateDynamic myTarget = new TargetCreateDynamic(); myTarget.Entity = entity; CreateRequest create = new CreateRequest(); create.Target = myTarget; //Выполняем собственно сам запрос CreateResponse response = (CreateResponse)Service.Instance.Execute(create); // ... ///
//Собственно создание OwnerProperty Owner owner = new Owner("systemuser", id); OwnerProperty ownerProperty = new OwnerProperty("ownerid", owner);
И это работает, но как только я пытаюсь обновить сущность, где одно из измененных полей это Owner,
Service.Instance.Execute(new UpdateRequest { Target = new TargetUpdateDynamic { Entity = dynamicEntity } });
То все поля обновляются, а Owner каким был, таким и остается.
Что я только не делал, и в дебаге смотрел каждую строчку, ошибку — все проходит без сучка и задоринки. Включил Trace — ничего, чтобы мне помогло узнать, почему не обновляется Owner. Проштудировал SDK и ни одного упоминаня, как менять owner на страницах работы с этим самим owner нет, отличного от того, как я написал выше.
Оказывается!!! Для того чтобы сделать у существующей сущности обновление существующего Owner, существует специальный запрос на это дело и нужно создавать отдельный экземпляр класса SecurityPrincipal и посылать отдельный запрос, только для того, чтобы обновить одно поле!!!
Вот она! Эта серебрянная пуля:
public static void UpdateOwner(Guid ownerid, Guid entityid, string entityName) { SecurityPrincipal assignee = new SecurityPrincipal {PrincipalId = ownerid}; TargetOwnedDynamic target = new TargetOwnedDynamic {EntityId = entityid, EntityName = entityName}; AssignRequest assign = new AssignRequest {Assignee = assignee, Target = target}; AssignResponse assignResponse = (AssignResponse)Service.Instance.Execute(assign); }
Надеюсь кому-нибудь сэкономлю кучу нервов и запросов в google.
Читатели в 🇵🇱, пожалуйста, поддержите dev.by своими налогами!
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.