2016-12-06 4 views
0

Я изучаю разработку плагинов Dynamics 365.Dynamics 365 Исключение блокировки SDK плагина при обновлении строго типизированного объекта в режиме песочницы

Проблема: При вызове метода Update на строго типизированном объекте я получаю исключение. Точное сообщение об ошибке:

«System.Runtime.Serialization.SerializationException: Microsoft Dynamics CRM произошла ошибка Ссылочный номер для администраторов или поддержки:. # 1330ADC1»

Моя установка: Мое решение содержит простой плагин. Я создал строго типизированную учетную запись объекта. Режим изоляции плагина - это песочница. Поле Telephone1 - это строка.

Я извлекаю учетную запись из CRM, затем обновляю поле Telephone1 до нового значения и обновляю запись учетной записи. Простой :)

Код:

public class PostOperationaccountUpdate: IPlugin 
{ 
    public void Execute(IServiceProvider serviceProvider) 
    { 
     var organisationService = serviceProvider.GetService(typeof (IOrganizationService)) as IOrganizationService; 
     var context = serviceProvider.GetService(typeof (IPluginExecutionContext)) as IPluginExecutionContext; 

     var entityAccount = context.InputParameters["Target"] as Entity; 
     var id = entityAccount.Id; 

     var account = organisationService.Retrieve("account", id, new ColumnSet("telephone1")); 

     //Get a strongly typed version of the Account entity 
     var dbAccount = account.ToEntity<Account>(); 

     //Update the telephone1 field using the "old" way 
     account["telephone1"] = "1234567890"; 

     try 
     { 
      //This will pass 
      organisationService.Update(account); 

      //Update the strongly typed Account 
      dbAccount.Telephone1 = "plop"; 

      //This fails 
      organisationService.Update(dbAccount); 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 
} 

Что я пробовал: -> Я изменил режим изоляции плагина к None - это работает! В соответствии с передовой практикой, не рекомендуется

Спасибо за помощь Чарльз

+0

ли он работает в песочнице, если вы задерживаетесь? – Alex

+0

Является ли строго типизированный класс Account в другой DLL случайно? Если это так, я считаю, что вам придется его разложить в DLL плагина. Вы можете быстро проверить это, добавив класс Account.cs непосредственно в проект плагинов. – Polshgiant

+0

@Alex: Да. Если я сделаю, я сделаю это поздним и песочницей, он работает – h4ck3r8ug5

ответ

1

SerializationException происходит, когда вы смешиваете раннее связывание типов с кодом ожидает позднего связывания типов, here the MSDN gives some degree of explanation.

По существу, исключение возникает, когда требуется, чтобы платформа конвертировала между ранними и поздними типами.

Update ожидает поздний связанный с типом

organisationService.Update(dbAccount); // dbAccount should be an 'Entity' object 

и это вызывает исключение.

Я никогда не использую ранние переплете типы, так что я не могу достоверно сказать, как исправить свой код, но следующие статьи MSDN должны быть полезны:

+0

'Update' ожидает объект типа' Entity' -> 'public virtual void Update (Entity entity);'. Поздняя привязка или ранняя граница внутреннего типа - это «сущность», все ранние ограничения - в фоновом режиме, устанавливают значение атрибута с правильным типом данных crm, а также выравнивают данные во время извлечения. Я использую 'organisationService.Update (entity); 'как с ранними, так и с поздними связанными объектами. Поздняя или ранняя граница, оба являются объектами типа 'Entity', а создание и обновления должны работать взаимозаменяемо. – dynamicallyCRM

+0

Спасибо Алекс. Это заставило меня задуматься - я реорганизую свой код. Цените помощь! – h4ck3r8ug5

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

  • Нет связанных вопросов^_^