使用 QueryExpression 创建 OrganizationServiceFault

Using QueryExpression creates OrganizationServiceFault

我需要一些帮助。这是我使用的第一个 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 并像这样对 Record 使用简单的更新时 Training.Attributes["new_comments"] = "这个有效"; 然后我更新记录就没有错误了

我尝试只在 QueryExpression 中填充一个变量,然后在 QE 之外更新(以测试)。但似乎只有QE的存在才是问题。

我不知道接下来要看什么。我发现的任何东西似乎都没有帮助。我使用了注册插件工具来生成这个插件。

Plugin Tracing 显示如下,我认为这是关键。但我不太幸运找到答案。

System.ServiceModel.CommunicationObjectFaultedException: 通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为它处于 Faulted 状态。

一直想回到这里。事实证明它根本不是代码,而是分析器服务 and/or 沙箱服务。 (我不确定哪个托管公司没有回复我。但是在他们周末对服务器做了一些事情之后,代码现在可以工作了。)但是感谢您的回答。