Dynamics 365 (CRM) версии 9.1 онлайн C# код Ошибка: Идентификатор объекта должен совпадать со значением, установленным в наборе свойств - PullRequest
0 голосов
/ 23 марта 2020

При клонировании / копировании дочерних записей я использую foreach l oop, а затем создаю запись со всеми ее атрибутами. Я написал подобный код в другом проекте и работал нормально для меня.

Есть несколько статей / вопросов, основанных на одной и той же ошибке. Теперь моя проблема в том, как мне создать дочерние записи со всеми его атрибутами.

foreach (var packingList in oPEntityCollection.Entities)
{                                        
    packingList.Attributes.Remove("statuscode");
    packingList.Attributes.Remove("statecode"); 
    packingList.Id=Guid.Empty; 
    orgService.Create(packingList);
}

Другая странная проблема

Запись с таким же ключом уже существует

Код:

Entity parentEntity = orgService.Retrieve(context.PrimaryEntityName, context.PrimaryEntityId, new ColumnSet(true));    
parentEntity.Id = Guid.empty;
orgService.Create(parentEntity);

Даже если я создаю новый объект и копирую parentEntity, как показано ниже, я получаю эту ошибку.

Entity costcalEntity = new Entity();

costcalEntity = parentEntity;
costcalEntity.Id = Guid.Empty;
orgService.Create(costcalEntity);

Так что я в итоге создаю запись с основным именем и после создания записи, я обновляю ту же запись со старыми атрибутами записи.

Entity costcalEntity = new Entity();
costcalEntity.LogicalName = parentEntity.LogicalName;
costcalEntity["name"] = parentQuotationEntity.GetAttributeValue<string>("name");
costcalEntity.Id = Guid.Empty;
Guid newGuid = orgService.Create(costcalEntity);
if (newGuid != Guid.Empty)
{
    costcalEntity = parentEntity;
    costcalEntity.Id = newGuid;
    orgService.Update(costcalEntity);
}

, и это прекрасно работает.

Ответы [ 3 ]

1 голос
/ 24 марта 2020

В обоих случаях у вас одна и та же проблема, с root, потому что это идентификатор, который хранится в коллекции атрибутов сущности. Если вы посмотрите на раннее связанное поколение, вы можете получить доступ к Id по свойству entity.Id, а также к коллекции атрибутов, как показано в определении для идентификатора в основном идентификаторе:

public System.Nullable<System.Guid> AccountId
{
    [System.Diagnostics.DebuggerNonUserCode()]
    get
    {
        return this.GetAttributeValue<System.Nullable<System.Guid>>("accountid");
    }
    [System.Diagnostics.DebuggerNonUserCode()]
    set
    {
        this.OnPropertyChanging("AccountId");
        this.SetAttributeValue("accountid", value);
        if (value.HasValue)
        {
            base.Id = value.Value;
        }
        else
        {
            base.Id = System.Guid.Empty;
        }
        this.OnPropertyChanged("AccountId");
    }
}

Когда вы извлекаете существующую сущность, SDK CRM заполняет как идентификатор свойства, который вы обработали, так и коллекцию атрибутов, которую вы не обработали. Поэтому, чтобы иметь возможность дублировать его, вам нужно очистить идентификатор в обоих местах.

0 голосов
/ 24 марта 2020

Если ваш вопрос «Как дублировать сущность, полученную из CRM?», Ваш ответ может быть упрощен.

var entity = orgService.Retrieve(context.PrimaryEntityName, context.PrimaryEntityId, new ColumnSet(true)); 
entity.Id = Guid.Empty;
entity.Attributes.Remove("primaryGuid");
orgService.Create(entity);
0 голосов
/ 24 марта 2020

Вот как я решил это

 foreach (Entity packingList in oPEntityCollection.Entities)
                {
                    Entity newpackingList = new Entity()
                    {
                        LogicalName = packingList.LogicalName,
                    };
                    newpackingList.Attributes.AddRange(packingList.Attributes);                        
                    newpackingList.Attributes.Remove("primaryGuid");                       
                    Guid newOpGuid = orgService.Create(newpackingList);    
                    tracingService.Trace($"OP record created sucessfully with guid {newOpGuid}");

                    }

Итак, проблема в том, что я пытался присвоить packingList непосредственно newpackingList. Это вызвало присвоение атрибутов метаданных packingList, а также такие. Это было неприемлемо для crm

Но лучше добавить атрибут. Это сработало и создало все дочерние записи.

То же сработало и для родительской записи

Entity parentEntity = orgService.Retrieve(context.PrimaryEntityName, context.PrimaryEntityId, new ColumnSet(true)); 

   Entity newParentEntity = new Entity()
                        {
                            LogicalName = parentEntity.LogicalName,
                        };
newParentEntity.Attributes.AddRange(parentEntity.Attributes); 
 newParentEntity.Attributes.Remove("primaryGuid");
orgService.Create(newParentEntity);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...