2016-05-04 4 views
2

Я пытаюсь создать собственный рабочий процесс на Dynamics CRM. Мне нужно удалить некоторые объекты, когда удаляется другой объект.Пользовательский рабочий процесс Dynamics CRM перед удалением объекта

Я создал class library и я извлек Guid исключенное лицо с этим кодом:

protected override void Execute(CodeActivityContext executionContext) 
    { 
     ITracingService tracingService = executionContext.GetExtension<ITracingService>(); 

     IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>(); 
     IOrganizationServiceFactory serviceFactory = 
      executionContext.GetExtension<IOrganizationServiceFactory>(); 
     IOrganizationService service = 
      serviceFactory.CreateOrganizationService(context.UserId); 

     mService = service; 
     mExecutionContext = executionContext; 

     Guid myTipologyTypeDeleted = context.PrimaryEntityId; 
     bool isReading = context.PrimaryEntityName.Equals(new_tipologialettura_richiesta.EntityLogicalName); 
     bool isMaintenance = context.PrimaryEntityName.Equals(new_tipologiamanutenzionerichiesta.EntityLogicalName); 

     bool myResult = AddOnIntervention(isReading, isMaintenance, myTipologyTypeDeleted); 


     // Retrieve the summands and perform addition 
     result.Set(executionContext, myResult); 
    } 

И здесь все работает, я получаю Guid и я получаю type (чтение или техническое обслуживание).

Моя проблема заключается в том, что я пытаюсь получить объект с этим кодом (тот же код отлично работает в другом рабочем процессе, запущенном при создании записи, но при записи delete дает мне ошибку).

  Entity myReadingEntity = mService.Retrieve(new_tipologialettura_richiesta.EntityLogicalName, myTipologyTypeDeleted, new ColumnSet(true)); 

Здесь я получаю исключение о том, что никаких записей типа MyType с идентификатором myId не найдено.

Я проверил запись, и она все еще существует в БД, поэтому она не была удалена. Что я делаю неправильно?

Благодаря

+0

1) Если вы пытаетесь удалить дочерние записи записи, которая удаляется, рассмотрели ли вы изменение свойств отношений для автоматического удаления rec орды для вас? 2) Извлеките вызов, который не работает ... пытаетесь ли вы восстановить запись, которая в настоящее время удаляется? Вам нужно получить его, чтобы вы могли проверять на нем значения? 3) Вы говорите, что вы проверили db для записи, и она все еще существует, когда вы делаете эту проверку? Если вы проверяете, завершен ли рабочий процесс, но рабочий процесс не удался, тогда платформа могла бы отменить операцию удаления. – Polshgiant

+0

@Polshgiant спасибо, что ответили! Я отвечаю здесь: 1) это не ребенок, связанный только с операцией другого рабочего процесса. 2) У меня есть два объекта entityRef в этом объекте, который ссылается на два объекта, которые мне нужны в моих операциях, как я могу получить всю запись без сбоев? 3) возможно, да, это был откат, как вы сказали –

+0

Я бы ожидал, что платформа позволит вам восстановить запись, которая в настоящее время удалена, но если нет, то вы можете создать свою собственную сборку wf с более входными параметрами, а затем в wf-дизайнере вы можете передать значения из удаляемой записи. Имеет ли это смысл? – Polshgiant

ответ

1

Я думаю, что лучше всего написать пользовательскую логику здесь будет Plugin, вы должны написать плагин, который работает на

Message: Delete 
Stage: POST 

После регистрации плагина на Post Delete Operation, вы должны добавьте pre-image, который будет доступен по адресу Post Delete with all the attributes. Вместо того, чтобы выдавать запрос, лучше всего нажать нужные данные на изображении.

Взято из MSDN: Registering for pre or post images to access entity attribute values results in improved plug-in performance as compared to obtaining entity attributes in plug-in code through RetrieveRequest or RetrieveMultipleRequest requests.

В плагине изменить строки кода:

Entity myReadingEntity = mService.Retrieve(new_tipologialettura_richiesta.EntityLogicalName, myTipologyTypeDeleted, new ColumnSet(true)); 

к

if (context.PreEntityImages.Contains("YourImageName")) 
{ 
    Entity myReadingEntity = context.PreEntityImages["YourImageName"] 
}