#plugins #visual-studio-2017 #dynamics-crm-2016
Вопрос:
Мне нужна помощь. Это первое выражение запроса, которое я использовал с тех пор, как мне пришлось обновить свой SDK до 365.
На данный момент я даже не делаю ничего сложного, но если я использую выражение запроса в коде (как я делал 100 раз раньше) Я получаю ошибку в организации.
Это встроено в VisualStudio 2017 с использованием инструмента регистрации плагина 365SDK для создания плагина.
Итак, вот базовый код (и на данный момент он действительно базовый)
using System;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
namespace TrainerAppHistory.TransferHistory
{
/// <summary>
/// PreOperationipmahr_trainerapplicationUpdate Plugin.
/// Fires when the following attributes are updated:
/// ipmahr_transferhistory
/// </summary>
public class PreOperationipmahr_trainerapplicationUpdate : PluginBase
{
public PreOperationipmahr_trainerapplicationUpdate(string unsecure, string secure)
: base(typeof(PreOperationipmahr_trainerapplicationUpdate))
{
// TODO: Implement your custom configuration handling.
}
private readonly string preImageAlias = "PreImage";
protected override void ExecuteCrmPlugin(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new InvalidPluginExecutionException("localContext");
}
IPluginExecutionContext context = localContext.PluginExecutionContext;
IOrganizationService server = localContext.OrganizationService;
Entity Training = (Entity)context.InputParameters["Target"];
Entity preImageEntity = (context.PreEntityImages != null amp;amp; context.PreEntityImages.Contains(this.preImageAlias)) ? context.PreEntityImages[this.preImageAlias] : null;
EntityReference Contact = (EntityReference)preImageEntity.Attributes["ipmahr_contactid"];
bool transfer = Training.GetAttributeValue<bool>("ipmahr_transferhistory");
Guid recordID = Training.GetAttributeValue<Guid>("ipmahr_trainerapplicationid");
Guid contactid = Contact.Id;
if (transfer == true)
{
QueryExpression TopRecord = new QueryExpression("ipmahr_trainerapplication");
TopRecord.ColumnSet = new ColumnSet("ipmahr_trainerapplicationid");
EntityCollection results1 = server.RetrieveMultiple(TopRecord);
if (results1.Entities.Count > 1)
{
Training.Attributes["new_comments"] = "found them all";
}
//End Code
}
}
}
}
Когда я удаляю выражение запроса и просто использую простое обновление записи, подобное этому
Обучение.Атрибуты[«new_comments»] = «Это работает»;
Тогда у меня нет ошибок при обновлении записи.
Я попытался просто заполнить переменную в выражении запроса, а затем обновить (для тестирования) за пределами QE. Но, похоже, проблема заключается только в существовании QE.
Я не знаю, на что смотреть дальше. Кажется, ничто из того, что я нашел, не помогает. Я использовал инструмент Register Plugin для создания этого плагина.
Трассировка плагинов показывает следующее, и я думаю, что это ключ к этому. Но мне не очень-то везет в поиске ответов.
Система.Модель обслуживания.Исключение CommunicationObjectFaultedException: Объект связи, Система.Модель обслуживания.Каналы.Канал обслуживания, не может использоваться для связи, поскольку он находится в неисправном состоянии.
Комментарии:
1. Можете ли вы завернуть свой
results1 = server.RetrieveMultiple(TopRecord);
вtry/catch
блок и проверить наличие внутренних исключений?2. Давно хотел вернуться к этому. Оказывается, это был вовсе не код, а скорее служба профилировщика и/или служба песочницы. (Я не уверен, что именно, так как хостинговая компания мне не ответила. Но код теперь работает после того, как они что-то сделали с ним в выходные.) Но спасибо, что ответили.
Ответ №1:
Давно хотел вернуться к этому. Оказывается, это был вовсе не код, а скорее служба профилировщика и/или служба песочницы. (Я не уверен, что именно, так как хостинговая компания мне не ответила. Но код теперь работает после того, как они что-то сделали с сервером в выходные.) Но спасибо, что ответили.