2

Ich bin neu in CRM-Entwicklung. Ich habe eine benutzerdefinierte Entität "Kunde". Diese Entität hat ein Feld namens "defaultcustomer", das WAHR oder FALSCH sein kann. Ich arbeite an einem Plug-In, wo ich den "defaultcustomer" auf FALSE für alle "Kunden" einstellen muss. Ich mache es wie folgt:CRM 2011 KeyNotFoundException Ausnahme

FACTS:

ich das Plugin für die Entität „Kunde“ angemeldet haben selbst. Wenn also die Entität "Kunde" aktualisiert wird, wird das Plug-in ausgelöst.

private void MakeAllNonDefault() 
{ 

    try 
    { 
     QueryExpression query = new QueryExpression("customer"); 
     query.ColumnSet = new ColumnSet("defaultcustomer"); 

     EntityCollection retrieved = service.RetrieveMultiple(query); 

     foreach (Entity myCustomer in retrieved.Entities) 
     { 

      myCustomer["defaultcustomer"] = false; 
      service.Update(myCustomer); 
     } 

    } 
    catch (Exception ex) 
    { 
     throw new InvalidPluginExecutionException("An error occurred in MakeAllNonDefault(): " + ex.ToString()); 
    } 
} 

ERROR: Es wirft Fehler auf dieser Linie:

myCustomer["defaultcustomer"] = false; 

System.Collections.Generic.KeyNotFoundException: 
The given key was not present in the dictionary. 
+2

Dieser Fehlertyp geht verloren, wenn Sie die frühzeitige Bindung verwenden und die zurückgegebenen Entitäten in Instanzen Ihrer Entität "Customer" umwandeln. –

Antwort

7

Der Fehler bedeutet, dass bestimmte Feld in der Sammlung von Eigenschaften nicht vorhanden ist. In CRM sind nur Eigenschaften enthalten, die festgelegt oder aktualisiert wurden.

Probieren Sie etwas wie:

foreach (Entity myCustomer in retrieved.Entities) 
{ 
    if (myCustomer.Attributes.ContainsKey("defaultcustomer")) 
    { 
     myCustomer["defaultcustomer"] = false; 
    } 
    else 
    { 
     myCustomer.Attributes.Add("defaultcustomer", false); 
    } 
    service.Update(myCustomer); 
} 
+1

Dies ist möglich, obwohl er dieses Attribut explizit in das 'ColumnSet' eines neuen' QueryExpression' einbezieht? –

+0

Es funktioniert nicht für mich. –

+0

Welchen Fehler/andere Informationen erhalten Sie? – glosrob

0

Die von @glosrob erzielte Lösung scheint in Ordnung. Erhalten Sie immer noch "Der angegebene Schlüssel war nicht im Wörterbuch vorhanden"?

Versuchen Sie, ITracingService zu verwenden, um weitere Informationen zum Ausführungsfluss des Plugins zu erhalten.

1

Haben Sie überprüft, dass das Feld wirklich defaultcustomer heißt?

Wenn es sich um eine benutzerdefinierte Entität handelt, ist es wahrscheinlich, dass das Feld mit einem Präfix beginnt, z. B. new_defaultcustomer. Stellen Sie sicher, dass Sie den Namen des Felds und nicht den Anzeigenamen verwenden.

+0

Feldname ist OK. –

+0

Eigentlich ist das ein sehr guter Punkt. Wenn es sich um eine benutzerdefinierte Entität handelt, haben alle Felder (außer den standardmäßig erstellten, erstellten usw.), soweit ich weiß, ein Präfix. – glosrob

0

Während Update alle Crm Felder sind False akzeptieren, dass was Sie das Feld aktualisieren. Dazu können Sie Pre/Post Images im Plugin verwenden. Sie werden diesen CRM-Feldschlüssel finden und aktualisieren, was Sie brauchen.

Verwandte Themen