【发布时间】:2021-03-18 20:47:57
【问题描述】:
我需要一些帮助。这是我使用的第一个 QueryExpression,因为我必须将我的 SDK 更新到 365。
此时我什至没有做任何努力,但如果我在代码中使用 QueryExpression(就像我之前做过 100 次一样),我会得到一个 OrganizationServiceFault。
这是在 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 && 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
}
}
}
}
当我删除 QueryExpression 并像这样对记录使用简单的更新时 Training.Attributes["new_cmets"] = "这行得通"; 那么我更新记录就没有错误了。
我尝试在 QueryExpression 中填充一个变量,然后在 QE 之外更新(以测试)。但问题似乎只是 QE 的存在。
我不知道接下来要看什么。我发现似乎没有任何帮助。我使用了注册插件工具来生成这个插件。
插件跟踪显示以下内容,我认为这是关键。但我找不到答案。
System.ServiceModel.CommunicationObjectFaultedException:通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为它处于故障状态。
【问题讨论】:
-
您能否将您的
results1 = server.RetrieveMultiple(TopRecord);包装在try/catch块中并检查内部异常? -
一直想回到这个。事实证明,这根本不是代码,而是分析器服务和/或沙盒服务。 (我不确定哪个托管公司没有回复我。但是在他们在周末对它做了一些事情之后,代码现在可以工作了。)但是谢谢你的回答。
标签: plugins visual-studio-2017 dynamics-crm-2016