2015-02-18 2 views
0

У меня есть синхронный плагин, который запускается при любой возможности создания/удаления/обновления. И в плагине, если возникла какая-либо ошибка, я сделал функцию, которая вставляет журнал в базу данных.Невозможно лить объект типа CRM 2013 Plugin

В таблице одно поле, если EntityId, поэтому я пишу следующий код:

foreach (PropertyBagEntry entry in (IEnumerable<PropertyBagEntry>)context.InputParameters.Values) 
{ 

     DynamicEntity entity = (DynamicEntity)entry.Value; 
     foreach (Property property in (IEnumerable<Property>)entity.Properties) 
     { 
      if (property.GetType().Name == "KeyProperty") 
      { 
       str4 = ((Key)entity.Properties[property.Name]).Value.ToString(); 
       break; 
      } 
     } 
} 

В STR4 я получаю EntityId текущего процесса.

Но это дает одно исключение весьма часто:

Необработанное исключение: System.InvalidCastException: Не удается привести объект типа 'ValueCollection [System.String, System.Object]' набрать «System.Collections .Generic.IEnumerable`1 [Microsoft.Crm.Sdk.PropertyBagEntry]

И я определил, что следующая строка дает ошибку

Еогеасп (запись PropertyBagEntry в (IEnumerable) context.InputParame ters.Values)

У кого-нибудь есть идея преобразовать эту строку по-другому?

+1

Это выглядит CRM 4.0 код, поскольку DynamicEntity является 4,0 SDK сущность ... – Daryl

ответ

0

Я понимаю, что вы хотите получить идентификатор GUID текущей записи, если это так, то вы можете сделать это, как:

public void Execute(IServiceProvider serviceProvider) 
{ 
    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 

    try 
    { 
     if (context.MessageName == "Create" || context.MessageName == "Update") 
     { 
      if (context.InputParameters.Contains("Target") && (context.InputParameters["Target"] is Entity)) 
      { 
       Entity currentEntity = (Entity) context.InputParameters["Target"]; 
       Guid currentRecordGuid = currentEntity.Id; 
      } 

     } 
    } 
    catch (Exception ex) 
    { 

    } 
} 
+0

Нет, это не GUID текущей записи, его идентификатор proprty, который я получаю из записи PropertyBagEntry, является типом «Динамическая сущность» или «Moniker». – Chirag

0

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

public static Guid GetEntityIdFromContext(IPluginExecutionContext context) 
{ 
    string messageName = context.MessageName; 
    if (context.PrimaryEntityId != Guid.Empty) 
    { 
     return context.PrimaryEntityId; 
    } 
    else if (messageName == "Create") 
    { 
     return new Guid(context.OutputParameters["id"].ToString()); 
    } 
    else 
    { 
     return context.PrimaryEntityId; 
    } 
} 

Если это не поможет, не могли бы вы обеспечивая сообщение, которое вызывает ошибку?

+0

e8bba7ae-a552-de11-b475-001e0b4882e2 --------------------------------------- ---------------- \t 2b301650-2a38-e411-8cda-005056a07625 \t возможность Плагин Необработанное исключение: система.InvalidCastException: невозможно сбрасывать объект типа 'ValueCollection [System.String, System.Object]' , чтобы ввести 'System.Collections.Generic.IEnumerable'1 [Microsoft.Crm.Sdk.PropertyBagEntry]'. – Chirag

0

Если

Необработанное исключение: System.InvalidCastException: Невозможно бросить объект типа 'ValueCollection [System.String, System.Object]' ввести «System.Collections.Generic.IEnumerable`1 [Microsoft.Crm.Sdk.PropertyBagEntry]

действительно ваша ошибка, чем ваша проблема не связана с линией

foreach (Property property in (IEnumerable<Property>)entity.Properties) 

, но с линии:

foreach (PropertyBagEntry entry in (IEnumerable<PropertyBagEntry>)context.InputParameters.Values) 

Тип context.InputParameters.Values ​​не литьевой к IEnumerable

+0

Да, я знаю это, но как я могу это решить? – Chirag

+1

@Chirag Не класть все свойство Values, но перечисляйте каждое значение в коллекции InputParameters.Values, а затем проверяйте, какой тип он перед литьем (используйте либо оператор is, либо как). – Daryl

+0

Функционально я понимаю, что вы говорите, но поскольку я новичок в CRM, я не могу написать код, чтобы получить то же самое. Пожалуйста, дайте код для этого. – Chirag