首页 > 其他分享 >解决Found multiple records While trying to resolve alternate key.

解决Found multiple records While trying to resolve alternate key.

时间:2023-09-07 21:02:27浏览次数:45  
标签:resolve multiple req 记录 alternate 查询 fetchXmlDoc var config

这是我的第503篇原创文章,写于2023年9月7日。

碰到一个奇怪的问题,用户在界面上更新记录不报错,

但是通过代码使用Web API来更新代码会报错,使用的是普通的更新代码:

var clientUrl = Xrm.Utility.getGlobalContext().getClientUrl();
var req = new XMLHttpRequest();
var requestData = {
  "ly_name": "罗勇"
};
req.open("PATCH", `${clientUrl}/api/data/v9.2/ly_demoentitiess(93a0d8f8-8c5b-4a4e-aeb2-7c7e7a18fc79)`);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Mscrm.Suppressduplicatedete", "false");
req.onreadystatechange = function () {
    if (this.readyState == 4) {
        req.onreadystatechange = null;
        if (this.status == 204) {
            console.log("updated");
        }
        else {
            var error = JSON.parse(this.response).error;
            Xrm.Navigation.openErrorDialog({ message: error.message });
        }
    }
}
req.send(JSON.stringify(requestData));


碰到的错误返回信息如下:

{
    "error": {
        "code": "0x8004023b",
        "message": "Found multiple records While trying to resolve alternate key."
    }
}


后来经过逐步排查,是这个实体的RetrieveMultiple 的Pre Operation阶段的插件代码修改了查询条件,增加了一些关联表,关联后会使返回的记录翻倍,比如说客户和联系人关联,会导致返回的客户记录翻倍,当然,实际查询结果的话,如果添加了Distinct = 'true' 的话可能看到的结果是没有问题的。

当然我们觉得奇怪的是,更新记录,指定了记录ID,为啥会再走一次RetrieveMultiple 消息了,估计啊,通过代码更新记录的时候,这个查询是通过QueryExpression来做的,那怕查询条件指定了查询记录的主键,也会通过RetrieveMultiple来查询出这条记录,而不是通过Retrieve来查找出这条记录。而在界面表单修改后保存,查询记录走的Retrieve消息,所以没有问题。

大致了解了问题原因后,那么解决办法就是要让指定记录主键进行的查询的时候不要再返回翻倍的结果就可以,经过尝试后,的确这样可以解决问题。

方法比较简单,就是如果RetrieveMultiple消息中的查询条件的查询字段是记录的主键字段,操作符是eq的话,就不要再和其他表关联,也不要修改筛选条件,因为既然是根据主键来查找记录,最多也就一条,再加其他筛选条件意义不大。

        private static string BuildFilterXmlForQuery(string fetchXml, RetieveMultipleFilterConfig config)
        {
            if (string.IsNullOrEmpty(fetchXml)) return string.Empty;
            if (config == null) return fetchXml;
            try
            {
                XDocument fetchXmlDoc = XDocument.Parse(fetchXml);
                if (!!config.Distinct)
                {
                    SetAttributeNode(fetchXmlDoc.Root, "distinct", "true");
                }

                SetAttributeNode(fetchXmlDoc.Root, "no-lock", "false");

                var entityElement = fetchXmlDoc.Descendants("entity").FirstOrDefault();
                if (entityElement != null)
                {
                    var entityLogicalName = entityElement.Attribute("name").Value;

                    var conditionList = fetchXmlDoc.Descendants("condition").ToList();

                    if (conditionList.Any(condition => condition.Attribute("operator").Value.Equals("eq") && condition.Attribute("attribute").Value.Equals($"{entityLogicalName}id")))
                    {
                        return fetchXmlDoc.ToString();
                    }

                    if (!string.IsNullOrEmpty(config.Filter))
                    {
                        entityElement.Add(XElement.Parse(config.Filter));
                    }

                    if (config.LinkEntities != null && config.LinkEntities.Any())
                    {
                        foreach (var linkEntity in config.LinkEntities)
                        {
                            entityElement.Add(XElement.Parse(linkEntity));
                        }
                    }
                }
                return fetchXmlDoc.ToString();
            }
            catch (Exception ex)
            {
                throw new InvalidPluginExecutionException("An error occurred in the processing query filter.", ex);
            }
        }


标签:resolve,multiple,req,记录,alternate,查询,fetchXmlDoc,var,config
From: https://blog.51cto.com/luoyong/7401425

相关文章

  • 使用GO 程序指定IP地址访问 http/https 地址 类似curl --resolve XXXIP:PortYYY
    需求,使用GO程序指定IP地址访问http/https地址传入参数:ipAddr//ipv4地址string值serviceUrl//url地址string值hostContainPort//HostHeader是否带url的端口bool值返回值:responseCode//http状态码int类型,Host//request请求HostHeaderstring类型 ......
  • 【错误记录】Android Studio 创建 Module 模块报错 ( Cannot resolve external depend
    文章目录一、报错信息二、解决方案目前使用的是最新的Gradle配置,创建Module生成的源码与Gradle配置出现了冲突,导致的问题;解决此类问题,要仔细检查Gradle构建脚本,排查每个依赖库的来源;本次错误就是AS系统自动成的Module修改了Gradle构建脚本,导......
  • 报org.apache.axis cannot be resolved to a type且Syntax error on token "enum", cl
    一位专门负责导数据和单点登录模块的同事最近提交了一些代码,但由于他出差了,代码同步下来却发现报如下的错误:org.apache.axiscannotberesolvedtoatype且Syntaxerrorontoken"enum",classexpected错误查看出错文件发现代码中凡是出现“oper.setStyle(org.apache.axis.enum......
  • npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
       npx-pnpm@6npmi参考:https://blog.csdn.net/weixin_40461281/article/details/115543024......
  • Qt编译报错:multiple definition of
    解决方法一:在.pro文件下查看SOURCES+=和HEADERS+=也没有重复引入文件,删除重复的文件即可。解决方法二:把debug文件夹下的.o文件都删除,然后再编译下。解决方法三:如果.h文件中有类的定义和实现,则实现时在每个成员前加inline。  转载于:QT项目出现multipledefinitionof错误......
  • idea 创建maven项目出现 Cannot resolve plugin org.apache.maven.plugins:maven-jar-
    idea创建maven项目出现Cannotresolvepluginorg.apache.maven.plugins:maven-jar-plugin:3.3.0如下图所示:遇到这个问题很多次了,也看了很多别人的解决方案,大致分为两种问题:1、maven路径问题:在idea中找到File-Settings通过搜索框找到maven,查看maven的安装路径和本地仓库......
  • IDEA cant resolve symbol String
    问题:在做新项目时报IDEAcantresolvesymbolString(IDEA不能识别String类型)      一脸懵,不光这个这样,其他的第三方的包也没法导进来猜测:刚开始以为是maven依赖没用导进来,后来发现String类竟然也不行,     于是猜测是JDK的问题,重新设置了一下JDK,发现也不......
  • [React Typescript] Strongly type Shared props for multiple components (React.FC<
    import{Equal,Expect}from"../helpers/type-utils";typeInputProps=React.ComponentProps<"input">;constCOMPONENTS={text:(props)=>{return<input{...props}type="text"/>;},number:(p......
  • cocos2dx之CCLayerMultiplex
    刚开始接触这个东西,弄了好久都没有弄好,我自己太笨了,现在我将如何创建一个CCLayerMultiplex过程写出来,代码如下:CCLayer*mainLayer=newMenuDemo;CCLayer*menu1=newMenuDemoItem1;CCLayer*menu2=newMenuDemoItem2;CCLayer*menu3=newMenuDemoItem3;......
  • ios开发之--Multiple commands produce "xxxxx"
    新拉下来的项目执行完podinstall后,报如下错误,是因为使用了新的构建系统,改成原来的就可以了,如下图:  选择后,进入下图: 选择LegacyBuildSystem即可通过编译!重新编译即可,仅做记录!作者:稻草人11223......