EA 16跨用户API更新Diagram报错:No such diagram found having diagram GUID
EA 16跨用户更新Diagram报错“No such diagram found having diagram GUID”的解决方法
问题重现
C#脚本在EA 15中可正常完成跨用户操作(user1创建/更新Diagram→user2后续更新),但在EA 16中执行user2的diagram.Update()时抛出错误:“No such diagram found having diagram GUID:”。即使调用Repository.ReloadDiagram(),或开启UI的“Design->Diagram->Options->auto reload changed diagram”选项,问题仍存在,仅手动重载可正常更新。
核心原因
EA 16对跨会话的对象缓存与权限校验机制做了调整:
- 跨用户登录后,通过
GetDiagramByGuid()获取的Diagram对象可能仍绑定旧会话的缓存,未同步服务器端最新的图状态 ReloadDiagram()仅刷新服务器端的图数据,但不会自动更新本地已获取的Diagram对象引用
解决方案
1. 重载后重新获取Diagram对象
调用ReloadDiagram()后,不要复用之前的diagram引用,需重新通过GUID或DiagramID获取最新的Diagram实例,再执行更新操作。
2. 修正Repository实例引用问题
原代码存在变量混淆(connection.EARepository与repository未统一),需确保所有操作使用当前用户会话的Repository实例。
3. 手动释放COM对象
操作完成后释放Diagram和Repository的COM对象,避免EA进程残留导致缓存异常。
修改后的代码示例
// 连接user1并更新图 EA.Repository repoUser1 = new EA.Repository(); repoUser1.SuppressSecurityDialog = true; repoUser1.SuppressEADialogs = true; bool isOpenedUser1 = repoUser1.OpenFile2("your-eap-file-path", "user1", "password"); if (isOpenedUser1) { EA.Diagram diagramUser1 = repoUser1.GetDiagramByGuid("target-diagram-guid"); if (diagramUser1 != null) { diagramUser1.Name = "xyz"; diagramUser1.Update(); // 释放COM对象 System.Runtime.InteropServices.Marshal.ReleaseComObject(diagramUser1); } repoUser1.CloseFile(); System.Runtime.InteropServices.Marshal.ReleaseComObject(repoUser1); } // 连接user2并更新图 EA.Repository repoUser2 = new EA.Repository(); repoUser2.SuppressSecurityDialog = true; repoUser2.SuppressEADialogs = true; bool isOpenedUser2 = repoUser2.OpenFile2("your-eap-file-path", "user2", "password"); if (isOpenedUser2) { // 先获取图ID并释放临时对象 EA.Diagram tempDiagram = repoUser2.GetDiagramByGuid("target-diagram-guid"); if (tempDiagram == null) return; int diagramId = tempDiagram.DiagramID; System.Runtime.InteropServices.Marshal.ReleaseComObject(tempDiagram); // 重载图数据 repoUser2.ReloadDiagram(diagramId); // 重载后重新获取最新的图实例 EA.Diagram diagramUser2 = repoUser2.GetDiagramByGuid("target-diagram-guid"); if (diagramUser2 != null) { diagramUser2.Name = "abc"; diagramUser2.Update(); System.Runtime.InteropServices.Marshal.ReleaseComObject(diagramUser2); } repoUser2.CloseFile(); System.Runtime.InteropServices.Marshal.ReleaseComObject(repoUser2); }
额外注意事项
- 确保user2拥有目标Diagram的编辑权限,权限不足也可能触发类似错误
- 若仍存在同步问题,可在
ReloadDiagram()后添加短暂延迟(如System.Threading.Thread.Sleep(500)),确保服务器端数据同步完成
内容的提问来源于stack exchange,提问作者Niraj Chapla
相关产品推荐
相关产品推荐

