2016-10-31 1 views
0

Ich bin neu in C# und Plugins für Dynamik. Um zu lernen und zu testen, habe ich erfolgreich ein paar sehr einfache Plugins erstellt, die funktionierten. Jetzt versuche ich, mehr herauszufinden, was ich eigentlich mit Plugins machen muss - ich versuche, den Wert eines Felds für eine benutzerdefinierte Entität zu ermitteln und diesen Wert zu verwenden, um ein Attribut für eine zugehörige benutzerdefinierte Entität zu aktualisieren Entität.C# - Dynamics crm Online-Plugin - Feldwert verwenden, um Attribut der verbundenen Entität

Mein Plugin ist in der Update-Nachricht einer benutzerdefinierten Entität (new_registration) registriert. Es wird asynchron nach der Operation ausgeführt. Das Feld, das das Plugin aktualisiert und auslöst (ein Optionsfeld "Status"), wird nirgendwo im Code verwendet.

Hier ist mein Code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using System.ServiceModel; 
using Microsoft.Xrm.Sdk; 

namespace PlugInTests 
{ 
    public class AdjustTimeSlots: IPlugin 
    { 
     public void Execute(IServiceProvider serviceProvider) 
     { 
      //Extract the tracing service for use in debugging sandboxed plug-ins. 
      ITracingService tracingService = 
       (ITracingService)serviceProvider.GetService(typeof(ITracingService)); 

      // Obtain the execution context from the service provider. 
      IPluginExecutionContext context = (IPluginExecutionContext) 
       serviceProvider.GetService(typeof(IPluginExecutionContext)); 

      if (context.InputParameters != null) 
      { 
       Entity entity = (Entity)context.InputParameters["Target"]; 
       Guid id = entity.Id; 
       tracingService.Trace("got input parameters"); 

       //get time slot 
       string slot = (string)entity.Attributes["new_yourtimeslot"]; 
       EntityReference eventclass = (EntityReference)entity.Attributes["new_eventregistrationrelationshipid"]; 
       tracingService.Trace("got time slot"); 

       //set updated entity (event/class) 
       Entity parentevent = new Entity("new_eventclass"); 
       parentevent.Id = eventclass.Id; 
       parentevent.Attributes["new_timeslotsfordelete"] = slot; 


       // Obtain the organization service reference. 
       IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 
       IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); 

       //update event record 
       tracingService.Trace("Update time slot plugin"); 
       service.Update(parentevent); 
      } 
     } 
    } 
} 

Durch Tests habe ich verengt, dass diese auf dieser Linie (zumindest anfangs) ist versagt:

string slot = (string)entity.Attributes["new_yourtimeslot"]; 

Der Fehler Ich erhalte im Plugin Trace-Logs ist:

Der angegebene Schlüssel war nicht im Wörterbuch vorhanden.

Ich habe überprüft und doppelt überprüft, und ich weiß, dass ich den richtigen Feldnamen bekomme. Mache ich etwas falsch, wie ich den Wert von den Eingabeparametern bekomme? Oder mache ich etwas kaputt? Ich merke nicht einmal, dass ich etwas verpfuschen könnte? Jede Hilfe wird geschätzt, danke.

Antwort

3

Versuchen Sie immer, den Attributwert auf sichere Weise zu erhalten (entweder nach dem Attribut in der Attributsammlung suchen oder die SDK-Methode wie unten verwenden). Wenn ein Attributwert null ist, wird das Attribut nicht als Teil der Attributsammlung zurückgegeben.

var slot = entity.GetAttributeValue<string>("new_yourtimeslot"); 

folgende Code-Schnipsel sieht nicht korrekt

EntityReference eventclass = (EntityReference)entity.Attributes["new_eventregistrationrelationshipid"]; 

Attributnamen und Beziehungen Namen selten gleich sind. Beziehungsnamen enthalten oft Ziel-Entität und verwandte Entität und meistens werden die Attribute, die am Ende die Lookups sind, unterschiedlich benannt new_eventregistrationid vielleicht? Überprüfen Sie den Namen, indem Sie Customization - Field Properties betrachten.

Außerdem erhalten sicher das zugehörige Attribut:

var eventclass = entity.GetAttributeValue<EntityReference>("new_eventregistrationid"); 
+0

Dank. Das war sehr hilfreich. Die Anpassungen beim Abrufen dieser Attributwerte funktionierten. Wo ist Ihre Referenz für diese Syntax? Ich habe MSDN Dokumentation gelesen und ich glaube nicht, dass ich diese Syntax gesehen habe? Ich könnte das mit alten Online-Beispielen verwirren, die eine veraltete Syntax haben. Danke für jede Hilfe. –