Клонировать объект телефонного вызова

Я собираюсь клонировать запись телефонного звонка, для этого я делаю следующее

Entity originalToDo = crmService.Retrieve("phonecall", new Guid(originalToDoId), cols);

Entity cloneToDo = originalToDo;

и удалить ActivityID и ActivityPartyID

if (originalToDo.Attributes.Contains("to"))
                {
                    foreach (Entity item in ((EntityCollection)(originalToDo.Attributes["to"])).Entities)
                    {
                        RemoveProperties(item, "activityid");
                        RemoveProperties(item, "activitypartyid");

                    }

                }

cloneToDo.Attributes["to"] = (EntityCollection)originalToDo.Attributes["to"];

 CreateRequest crRequest = new CreateRequest();  crRequest.Target = cloneToDo;

CreateResponse crResponse = (CreateResponse)service.Execute(crRequest);

Но выше строка дает мне исключение: Невозможно вставить дубликат ключа

Пожалуйста, предложите мне, что мне не хватает?


person Chirag    schedule 29.09.2014    source источник


Ответы (3)


Похоже, что идентификатор не был очищен. Я успешно использовал приведенный ниже код, чтобы правильно очистить его.

originalToDo.EntityState = null;    
originalToDo.Id = Guid.Empty;
originalToDo.Attributes.Remove("activityid");
person BlueSam    schedule 29.09.2014

Я добился успеха из следующего кода:

Сначала я удалил ActivityID из моего клона.

cloneToDo.Attributes.Remove("activityid");

Затем я добавил новый GUID в объект

cloneToDo.Id = Guid.NewGuid();

и это сделано.

ПРИМЕЧАНИЕ. Лучше удалить код состояния и код состояния.

cloneToDo.Attributes.Remove("statecode");
cloneToDo.Attributes.Remove("statuscode");
person Chirag    schedule 30.09.2014

У меня была такая же проблема, и после того, как я попробовал все решения, которые вы публикуете здесь, это не помогло. Я продолжал пробовать и нашел решение своей проблемы. Я копировал поле «Кому» в том виде, в каком получил его из исходного PhoneCall, и не знаю, почему оно не понравилось системе. Итак, решение для меня состояло в том, чтобы заново создать EntityColletion для установки TO, как показано здесь:

List<Entity> to = phoneCall.To != null ? phoneCall.To.ToList()
                                   : postImage != null & postImage.To != null ? postImage.To.ToList()
                                   : null;    
EntityCollection toCollection = new EntityCollection();
foreach (Entity t in to) {
     Entity toParty = new Entity("activityparty");
     toParty["partyid"] = t.GetAttributeValue<EntityReference>("partyid");   
     toCollection.Entities.Add(toParty);
}

А затем просто установите атрибут «TO» нового PhoneCall с этой новой созданной коллекцией EntityCollection («toCollection»). Надеюсь, это кому-нибудь поможет :)

person iair007    schedule 09.06.2016