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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:30:49