CRM 2011 - Данный ключ отсутствует в словаре - Обновить плагин контактов - PullRequest
0 голосов
/ 31 мая 2011

Я пытаюсь привязать плагин к событию обновления контакта в Microsoft Dynamics CRM 2011. Я сделал плагин и уже зарегистрировал сборку и шаг для своей организации.

снимок экрана: Средство регистрации CRM

На данный момент я использую пример кода для моего плагина.

public class Plugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        IPluginExecutionContext context = (IPluginExecutionContext)
        serviceProvider.GetService(typeof(IPluginExecutionContext));

    Entity entity;

    // Check if the input parameters property bag contains a target
    // of the create operation and that target is of type Entity.
    if (context.InputParameters.Contains("Target") &&
    context.InputParameters["Target"] is Entity)
    {
        // Obtain the target business entity from the input parameters.
        entity = (Entity)context.InputParameters["Target"];

        // Verify that the entity represents a contact.
        if (entity.LogicalName != "contact") { return; }
    }
    else
    {
        return;
    }

    try
    {
        IOrganizationServiceFactory serviceFactory =
            (IOrganizationServiceFactory)serviceProvider.GetService(
        typeof(IOrganizationServiceFactory));
        IOrganizationService service =
        serviceFactory.CreateOrganizationService(context.UserId);

        var id = (Guid)context.OutputParameters["id"];

        AddNoteToContact(service, id);
    }
    catch (FaultException<OrganizationServiceFault> ex)
    {
        throw new InvalidPluginExecutionException(
        "An error occurred in the plug-in.", ex);
    }
}

private static void AddNoteToContact(IOrganizationService service, Guid id)
{
    using (var crm = new XrmServiceContext(service))
    {

        var contact = crm.ContactSet.Where(
        c => c.ContactId == id).First();
        Debug.Write(contact.FirstName);

        var note = new Annotation
        {
            Subject = "Created with plugin",
            NoteText = "This Note was created by the example plug-in",
            ObjectId = contact.ToEntityReference(),
            ObjectTypeCode = contact.LogicalName
        };

        crm.AddObject(note);
        crm.SaveChanges();
    }

}
}

Но каждый раз, когда я изменяю контактную форму и сохраняю ее, я получаю эту ошибку:

The given key was not present in the dictionary

Я искал ответы уже неделю. Я надеюсь, что здесь есть кто-то, кто может помочь мне решить эту проблему. Я могу дать каждый код или информацию, которая вам нужна. Но сейчас я не могу думать ни о чем другом, что может помочь вам увидеть, где находится моя ошибка. Любая помощь очень ценится.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 31 мая 2011

Если плагин зарегистрирован как предварительный шаг, OutputParameters не будет содержать ключ "id", и он выдаст эту ошибку.

2 голосов
/ 31 мая 2011

М.Медхат абсолютно прав, но давайте подробнее остановимся на этом, чтобы вы поняли.

Первое, что вам нужно знать, это разница между InputParameters и OutputParameters. Краткое прочтение в этой статье MSDN, описывающей разницу между InputParameters и OutputParameters .

Обязательно обратите внимание на это утверждение:

Если плагин зарегистрирован для предварительного события, пакет свойств OutputParameters не будет содержать значение для ключа "id", поскольку основная операция еще не произошла.

Следовательно, этот код сломается:

var id = (Guid)context.OutputParameters["id"];

Поскольку вы уже создали сущность (отбрасывая ее из InputParameters), вы можете удалить эту строку и сделать что-то вроде этого:

AddNoteToContact(service, entity.id);

Не забывайте про трассировку, это ваш лучший друг. Может показывать информацию, когда выдается исключение. Вот хорошая ссылка на него: tracing

1 голос
/ 23 июня 2012

Вот некоторый код, который я использую, чтобы помочь показать все параметры, которые получает плагин при регистрации для данного сообщения и целевого объекта, используйте его, чтобы узнать, какие ключи присутствуют .

Если вы менее склонны копаться в документации, чтобы увидеть, что «должно» быть, чем просто попытаться увидеть, что на самом деле происходит, просто вставьте это в свой плагин, зарегистрируйте шаг, который вы намереваетесь использовать, и он покажет вам какие именно параметры были предоставлены для этого шага.

var propertiesList = String.Join("\n", 
        context.InputParameters.Select((p,i)=>ParamSelector(p,i,"Input")).Union(
        context.InputParameters.Select((p,i)=>ParamSelector(p,i,"Output"))));

//send the list to the tracing service.
context.Trace("Listing Inputput and Output Parameters for the plugin.\n" + propertiesList);

// throw an exception to see the trace values pop-up (in a synchronous plugin).
throw new InvalidPluginExecutionException("Check the trace for a listing of parameters.");

поддержка делегатов для форматирования:

private string ParamSelector(KeyValuePair<string, object> p, int index, string inOut) 
{  
    return String.Format("{2} \tKey:'{0}'\tValue:{1}\n{3}", p.Key, p.Value, inOut, EntityToTraceStrings(p.Value as Entity));    
}

private string EntityToTraceStrings(Entity entity)
{
    return entity == null ? String.Empty : String.Concat(
        String.Format("- Entity: {0} Id: {1}\n\t", entity.LogicalName, entity.Id),
        String.Join("\n\t", entity.FormattedValues.Select((p, j) => String.Format("Attribute: {0} \t Value: {1}", p.Key, p.Value))));
}
...