2016-05-04 17 views
2

Ich versuche, einen benutzerdefinierten Workflow auf Dynamics CRM zu machen. Ich muss einige Entitäten löschen, wenn eine andere Entität gelöscht wird.Dynamics CRM benutzerdefinierten Workflow vor dem Löschen von Entitäten

ich meine class library erstellt und ich die Guid der gelöschten Einheit mit diesem Code abgerufen:

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); 
    } 

Und hier alles funktioniert, bekomme ich die Guid und ich erhalte die type (Lesen oder Wartung).

Mein Problem ist, wenn ich versuche, die Entität mit diesem Code (der gleiche Code funktioniert perfekt in einem anderen Workflow bei der Datensatzerstellung funktioniert, aber auf Datensatz löscht mir einen Fehler).

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

Hier erhalte ich eine Ausnahme zu sagen, dass kein Datensatz vom Typ MyType mit id myId gefunden wurde.

Ich überprüfte den Datensatz und es noch in der DB vorhanden, so dass es nicht gelöscht wurde. Was mache ich falsch?

Dank

+0

1) Wenn Sie versuchen, Kind Datensätze löschen des Datensatzes, der gelöscht wird, haben Sie in Betracht gezogen, die Beziehungseigenschaften zu ändern, um den rec automatisch zu löschen Ords für dich? 2) Der Abruf, der fehlschlägt ... versuchen Sie, den Datensatz, der gerade gelöscht wird, abzurufen? Müssen Sie es abrufen, damit Sie Werte darauf überprüfen können? 3) Sie sagen, Sie haben die db für den Datensatz überprüft und es existiert immer noch, wann tust du das? Wenn Sie überprüfen, nachdem der Workflow ausgeführt wurde, der Workflow jedoch fehlgeschlagen ist, hat die Plattform möglicherweise den Löschvorgang zurückgesetzt. – Polshgiant

+0

@Polshgiant danke für die antwort! Ich antworte hier: 1) Es ist nicht Kind, nur durch einen anderen Workflow-Vorgang verwandt. 2) Ich habe zwei entityRef in dieser Entität, die sich auf zwei Entitäten bezieht, die ich in meinen Operationen benötige. Wie kann ich den gesamten Datensatz abrufen, ohne zu versagen? 3) wahrscheinlich ja, es war ein Rollback, wie Sie gesagt haben –

+0

Ich würde erwarten, dass die Plattform würde Sie den Datensatz abrufen, die gerade gelöscht wird, aber wenn nicht, dann könnten Sie Ihre benutzerdefinierte WF-Assembly akzeptieren mehr Eingabeparameter und dann in der Wf-Designer Sie könnten Werte aus dem Datensatz übergeben, der gelöscht wird. Ist das sinnvoll? – Polshgiant

Antwort

1

Ich denke, das Beste, was hier Ihre eigene Logik zu schreiben, wird ein Plugin, sind Sie ein Plugin schreiben sollen, die auf den

Message: Delete 
Stage: POST 

Nachdem das Plugin auf Post Delete Operation Registrierung

läuft, sollten Sie Fügen Sie einen pre-image hinzu, der unter Post Delete with all the attributes verfügbar sein wird. Anstatt einen Abruf durchzuführen, sollten Sie stattdessen die erforderlichen Daten in ein Bild übertragen.

von MSDN Genommen: 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.

In Ihrem Plugin die Codezeilen ändern:

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

zu

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