2016-07-21 9 views
0

Ich habe ein Plugin auf Update (pre-op) von InvoiceDetail, in denen ich die zugehörige Invoice abrufen, um einige weitere Informationen von ihm zu erhalten (dh: das Steuerprofil, das ausgewählt wurde auf Rechnungsebene) in CRM 2016.Retrieve ein Update in Plugin

Hier ist, wie ich es tun:

//xrmObjects is an object containing all useful objects in plugins/workflow... 
var invoice = RetrieveEntity(xrmObjects.Service, xrmObjects.TracingService, image["invoiceid"] as EntityReference, new ColumnSet("invoiceid", "pricelevelid", "customerid", "opportunityid", "xtc_tax_definition")); 

Diese spezifische Codezeile oben löst eine andere Update auf InvoiceDetail

Er Re die oben beschriebene Methode aufgerufen:

public static Entity RetrieveEntity(IOrganizationService service, ITracingService tracingService, EntityReference target, ColumnSet columnSet) 
{ 

    Entity entity = new Entity(); 

    try 
    { 
     entity = CrmServiceExtensions.ExecuteWithRetry<RetrieveResponse>(service, new RetrieveRequest 
     { 
      Target = target, 
      ColumnSet = columnSet 

     }).Entity; 
    } 
    catch (Exception ex) 
    { 
     tracingService.Trace($"Error retrieving {target.LogicalName}: {ex.Message}"); 
     throw; 
    } 

    return entity; 

} 

Hier ExecuteWithRetry:

public static T ExecuteWithRetry<T>(IOrganizationService service, OrganizationRequest request) 
      where T : OrganizationResponse 
     { 
      T response = null; 
      int i = 0; 

      // Maximum of five iterations. 
      while (i < 5) 
      { 
       try 
       { 
        response = (T)service.Execute(request); 

        // If the Execute does not throw an Exception, break the loop 
        break; 
       } 
       catch (System.Web.Services.Protocols.SoapException e) 
       { 
        // Retry if the SoapException is a "Generic SQL Error", 
        // otherwise rethrow the SoapException. 
        // "Generic SQL Error" might indicate a deadlock. 
        if (e.Detail.InnerText.ToLower().Contains("generic sql error")) 
        { 
         ++i; 
         // Wait (sleep thread) for i * 1000 milliseconds. 
         // So, first iteration waits 1 second, 
         // while fifth iteration will wait 5 seconds. 
         System.Threading.Thread.Sleep(i * 1000); 
        } 
        else throw; 
       } 
      } 

      if (i >= 5) 
      { 
       throw new Exception("ExecuteWithRetry: too many retries"); 
      } 

      return response; 
     } 

Ich habe bestätigt, dass nichts flippige geschieht, wird die Update-Meldung auf InvoiceDetail ausgelöst wieder an der Linie response = (T)service.Execute(request);

ich auch versucht, mit früh gebundenen und einen Kontext, um die Rechnung, aber die LoadProperty Methoden, die die Rechnung lädt die gleiche Sache ....

using (XrmServiceContext ctx = new XrmServiceContext(xrmObjects.Service)) 
{ 

    Xrm.InvoiceDetail image = xrmObjects.PluginContext.PreEntityImages["invoicedetail"].ToEntity<Xrm.InvoiceDetail>(); 

    try 
    { 
     ctx.LoadProperty(image, "invoice_details"); 
    } 
    catch (Exception ex) 
    { 
     throw new InvalidPluginExecutionException($"Error retrieving invoice details' invoice: {ex.Message}"); 
    } 

} 

Ich kann nichts in meiner Schrittkonfiguration sehen, die das tun würde. Irgendwelche Ideen?

+1

Ich nehme an, Sie haben das Offensichtliche getan und überprüft, dass es keine Plugins in der Rechnung 'Retrieve' Nachricht gibt? – jasonscript

+0

@jasonscript In der Tat, ich habe keine Workflow/Plugins für diese Nachricht und diese Entität (eigentlich keine für Rechnung) konfiguriert –

+1

So führt eine Abfrage gegen die Rechnung, während der Aktualisierung einer Rechnung Detail einen anderen Invoice Detail Plugin Update-Trigger zu auftreten? – Daryl

Antwort

1

Statt LoadProperty zu verwenden, ich abgerufen einfach die Rechnung manuell wie so

var invoice = ctx.InvoiceSet.SingleOrDefault(x => x.Id == image.InvoiceId.Id); 

Statt:

ctx.LoadProperty(image, "invoice_details"); 

Aus irgendeinem Grund LoadProperty unerwünschte Update-Nachricht über Kinderrechnungsdetails auslöst ..