Navicat 16 的 .nmf 文件仅保存逻辑元数据(表名、字段、外键等),不存储画布坐标、缩放比例等渲染态信息,因此手动拖动表后重启会重置为 Auto Layout 排版;只有字段顺序、隐藏/显示字段、自定义实体等逻辑修改可持久化,坐标需通过 Organize Diagram + 微调导出、截图或升级至 Premium 17.0.8+ 并启用 Save canvas layout 方式间接保留。
Navicat 16 逆向工程生成的 ER 图默认不保存手动调整后的坐标位置,这不是 bug,而是它把「布局状态」和「模型结构」分离存储的设计逻辑——坐标只存在于当前会话的内存视图中,未写入 .nmf 模型文件。
为什么手动拖动表后一重启就回到左上角?
navicat 的 .nmf 文件本质是 xml 结构化元数据,只存表名、字段、约束、外键关系等逻辑定义,**不序列化画布坐标(x/y)、缩放比例、连线锚点偏移等渲染态信息**。每次打开模型时,它都重新执行 auto layout 算法排版,导致所有手动调整丢失。
哪些操作会被丢弃?哪些能保留?
以下操作在关闭再打开 .nmf 后全部失效:
- 拖动单个表的位置
- 调整表框大小(字段区域高度/宽度)
- 拖拽连线端点、弯曲关系线
- 缩放画布(Ctrl + 鼠标滚轮)
但这些操作会被持久化:
- 双击表 → 修改字段顺序、隐藏/显示字段
- 右键表 → “编辑表” → 关闭“自动排列字段”
- 在“模型选项”中启用“显示完整数据类型”或“显示注释”
- 添加自定义实体(非数据库表)并设置其属性
如何让坐标位置真正保存下来?
没有官方开关,但有三个实操路径可绕过限制:
- 导出前固定布局:每次打开
.nmf后,先点Layout → Organize Diagram或Tree Layout,再手动微调 → 立即导出 PDF/SVG。此时导出结果含当前坐标,但模型文件本身仍不存位置 - 用截图工具替代:Windows 自带的
Snipping Tool或 macOSShift+Cmd+4截取全画布(需先适应窗口+缩放到 100%),比依赖导出更可靠 - 升级到
Navicat Premium 17.0.8+:该版本开始实验性支持「保存画布状态」(需在Tools → Options → Model → Save canvas layout勾选),但仅对新建模型生效,旧.nmf文件需另存为新文件才触发写入
容易被忽略的关键细节
即使你用了 Organize Diagram,如果表之间存在未识别的外键(比如 PostgreSQL 中 NOT VALID 约束),Navicat 会跳过关系计算,导致布局算法退化为随机散列——这时你拖半天,保存再打开还是堆在左上角。务必先运行 Model → Validate Model 确认所有外键已识别,再做布局固化。











