You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ArcGIS执行applyEdits出现This operation is not allowed while editing错误如何解决

问题原因

你遇到的错误码-2147467261是ArcGIS服务的空指针异常,本质是写入Entity2时,服务找不到你传入的entity1Id对应的Entity1记录,常见触发原因如下:

  • 执行顺序错误:你当前的组件代码中,第二个创建Entity2的请求没有等待第一个Entity1创建成功的回调完全执行就发起,两个请求异步并发,发第二个请求时Entity1还没真正写入admin.Editable版本
  • 编辑会话未同步:你指定了admin.Editable作为编辑版本,两次请求使用了不同的编辑会话,未提交的版本改动在不同会话间不可见
  • 外键强校验限制:Entity2配置了和Entity1的外键强校验,要求关联的Entity1必须已经提交到默认版本才能关联

解决方案

按优先级依次排查修改即可:

1. 修正请求执行顺序,确保串行执行

必须等第一个请求拿到返回的GUID、确认写入成功后,再构造Entity2的payload发起第二个请求,把第二个Entity2的创建逻辑完全放到第一个Entity1创建成功的subscribe回调内部,修改后的组件代码示例:

export class MyComponent {
    // 其他代码
    
    // 先发起Entity1的创建请求
    this.contactsService.applyEdits(obj.entity1, "entity1", "adds").subscribe(async (entity1Res: any) => {
        // 先校验Entity1是否创建成功,再提取返回的GUID
        if (entity1Res?.addResults?.[0]?.success) {
            const entity1Guid = entity1Res.addResults[0].globalId;
            // 构造Entity2的payload,绑定刚拿到的GUID
            const applyEdits_Adds = [{
                // Entity2的其他字段
                entity1Id: entity1Guid
            }];
            // 再发起Entity2的创建请求
            this.bulkUploadService.applyEdits(applyEdits_Adds, [], [], "entity2").subscribe((entity2Res: any) => {
                // Entity2创建成功后的业务逻辑
            }, error => {
                // Entity2错误处理逻辑
            })
        }
    }, error => {
        // Entity1错误处理逻辑
    })

    // 其他代码
}

2. 增加编辑会话ID,保持同一会话

在MyService的applyEditsWithUrl方法的FormData中添加sessionId参数,确保同一组关联编辑使用同一个会话,避免两次请求被判定为不同会话无法共享未提交的版本数据:

export class MyService {
    // 同一组关联编辑复用同一个会话ID,也可以根据业务场景动态生成
    private editSessionId = Date.now().toString();
    
    applyEditsWithUrl = (record: any, editMode: string, url: string) => {
        let fData: FormData = new FormData;
        fData.append("f", 'json');
        fData.append("gdbVersion", "admin.Editable");
        fData.append('token', <token>);
        // 新增会话ID参数
        fData.append('sessionId', this.editSessionId);

        // 原有逻辑保持不变
        if (editMode === 'updates') {
            // 相关代码
        } else if (editMode === 'adds') {
            // 简化版代码
            fData.append("adds", JSON.stringify([{"attributes": record}]));
        } else if (editMode === 'deletes') {
            // 相关代码
        }
        
        return this.httpClient.post(url, fData)
          .pipe(map((response: Response) => {
            return response;
          }))
          .pipe(catchError(error => {
            // 错误处理逻辑
          }));
    }

    // 其他代码
}

3. 确认GIS服务配置

如果前两步修改后问题仍存在,联系GIS服务管理员确认两点:

  • admin.Editable版本是否开启了多会话编辑权限,是否允许同一个版本同时处理多个关联编辑请求
  • Entity2和Entity1的外键关联配置是否要求必须提交Entity1到默认版本之后才能关联,若有该要求,需要在Entity1创建成功后先调用版本提交接口,再发起Entity2的创建请求

内容的提问来源于stack exchange,提问作者Luis_DV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:00:00