Статья изначально была написана для 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.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.