2016-10-31 1 views
0

Я новичок в C# и плагинах для динамики. Чтобы учиться и тестировать, я успешно создал пару очень простых плагинов, которые сработали. Теперь я пытаюсь получить больше того, что мне действительно нужно делать с плагинами - я пытаюсь получить значение поля в настраиваемой сущности и использовать это значение для обновления атрибута в соответствующем настраиваемом организация.C# - динамика crm онлайн-плагин - использовать значение поля для заполнения атрибута связанного объекта

Мой плагин зарегистрирован в сообщении «Обновить» настраиваемого объекта (называемого new_registration). Он работает после операции, асинхронно. Поле, которое обновляет и запускает плагин (параметр, заданный в поле «Статус»), нигде не используется в коде.

Вот мой код:

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

Через испытание, я сузил, что это невозможно сделать (по крайней мере на начальном этапе) на этой линии:

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

Ошибку я получаю в журналах отслеживания плагина:

Данный ключ отсутствует в словаре.

Я проверил и дважды проверял, и я знаю, что получаю имя поля правильно. Я делаю что-то неправильно в том, как я получаю значение от входных параметров? Или я что-то испортил, я даже не понимаю, что я могу запутаться? Любая помощь приветствуется, спасибо.

ответ

3

Всегда пытайтесь получить значение атрибута безопасным способом (либо проверьте атрибут в коллекции атрибутов, либо используйте метод SDK, как показано ниже). Если значение атрибута равно null, атрибут не возвращается как часть коллекции атрибутов.

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

Следующий фрагмент кода не выглядит корректные

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

имена атрибутов и отношения имена редко совпадают. Имена соединений часто включают целевую сущность и связанный объект, и чаще всего атрибуты, которые в конечном итоге являются поисками, называются иначе new_eventregistrationid, может быть? Дважды проверьте название, посмотрев на Customization - Field Properties.

Кроме того, безопасно получить атрибут, связанный:

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

Спасибо. Это было очень полезно. Корректировки в работе с этими значениями атрибутов. Где ваша ссылка на этот синтаксис? Я читал документацию msdn, и я не верю, что видел этот синтаксис? Я мог бы смутить это со старыми онлайн-примерами с устаревшим синтаксисом. Спасибо за любую помощь. –

Смежные вопросы