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
相关产品推荐
相关产品推荐

