Создавая родительский и дочерний объект в одной транзакции, AddRelatedObject генерирует исключение - PullRequest
0 голосов
/ 07 февраля 2019

Я создал сборку для использования в рабочем процессе в Dynamics 365 v9.

У меня есть родительская сущность с родительским отношением 1: N к моей дочерней сущности.Я хочу создать родительский и дочерний элементы в одной транзакции, чтобы в случае сбоя ничего не происходило.

В документации говорится, что это делается с помощью метода AddRelatedObject .

var parent = new Parent()
{
    Name = "PARENT"
};

var child = new Child()
{
    Name = "CHILD"
};

crmContext.AddObject(parent);
crmContext.AddRelatedObject(parent, new Relationship("my_relationship"), child);
crmContext.SaveChanges();

Классы для Parent и Child были созданы с помощью плагина Early Bound Generator для XrmToolbox и не были изменены.

Когда я вызываю SaveChanges, я получаю исключение:

Сообщение: при обработке этого запроса произошла ошибка.
Внутреннее сообщение: не удалось найти запись для обновления

Я не знаю, почему это происходит.Тот же код работает в CRM 2011. Если я удаляю строку AddRelatedObject, родительский объект создается просто отлично.

Есть идеи, что я делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Для меня проблемой оказался отдельный рабочий процесс, связанный с дочерним объектом, который пытается обновить родительский объект.Это было расстроено, потому что предполагалось, что был родитель, когда его не было.

Я положил Check Condition в начале рабочего процесса, чтобы прекратить его, если нет родительской записи, которая теперь решила ошибку.

Я не осознавал, что ошибки, вызванные другими плагинами / рабочими процессами, будут всплывать на моем месте.

Для всех, кто получил эту ошибку, я бы проверил две вещи:

  • Плагины, зарегистрированные для родительских или дочерних объектов
  • Рабочие процессы, связанные с родительскими или дочерними объектами
0 голосов
/ 07 февраля 2019

Цитируя ответ на вопрос на этот вопрос , вы можете попробовать:

EntityA primaryEntity = new EntityA() { //initialise me... };
EntityB secondaryEntity = new EntityB() { //initialise me... };

context.AddObject(primaryEntity);
context.AddObject(secondaryEntity);

// This is the key part: explicitly link the two entities
context.AddLink(primaryEntity, 
    new Relationship("relationship_name_here"), secondaryEntity);

// commit changes to CRM
context.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...