问题
一次 Seed 加载可能在循环引用缺失的情况下结束,却仍然报告成功。
当最终的引用更新失败一次后,ObjectStack 不会进行第二次尝试。引用仍为 null,但结果依然显示 success: true、errors: [] 和 totalErrored: 0。
复现
测试数据
测试只插入以下两条记录。为了更直观地展示数据内容,可等价表示为两个 CSV:
audit_department:
name,head_id
Engineering,Alice
audit_worker:
name,department_id
Alice,Engineering
说明:以上 CSV 仅用于直观展示测试数据。实际复现仍通过 SeedLoaderService 的 records 数组加载,并不是从 CSV 文件执行导入。
这两条记录互相引用。Engineering 首先插入,此时 Alice 尚不存在,因此 Engineering.head_id → Alice 必须稍后补充。Alice 随后插入,此时 Engineering 已经存在,因此可以立即保存 Alice.department_id → Engineering。
两条记录都存在后,ObjectStack 应使用 Alice 生成的员工 ID 更新 Engineering.head_id。
复现步骤
- 使用默认配置,在全新的 SQLite 数据库中加载上述两条 Seed 记录。
- 在测试中拦截
engine.update,仅让第一次更新 audit_department.head_id 时抛出 Error("fetch failed"),后续调用正常执行。
- 加载结束后查询记录并检查 Loader 返回结果。
问题
一次 Seed 加载可能在循环引用缺失的情况下结束,却仍然报告成功。
当最终的引用更新失败一次后,ObjectStack 不会进行第二次尝试。引用仍为 null,但结果依然显示 success: true、errors: [] 和 totalErrored: 0。
复现
测试数据
测试只插入以下两条记录。为了更直观地展示数据内容,可等价表示为两个 CSV:
audit_department:audit_worker:说明:以上 CSV 仅用于直观展示测试数据。实际复现仍通过
SeedLoaderService的records数组加载,并不是从 CSV 文件执行导入。这两条记录互相引用。Engineering 首先插入,此时 Alice 尚不存在,因此
Engineering.head_id → Alice必须稍后补充。Alice 随后插入,此时 Engineering 已经存在,因此可以立即保存Alice.department_id → Engineering。两条记录都存在后,ObjectStack 应使用 Alice 生成的员工 ID 更新
Engineering.head_id。复现步骤
engine.update,仅让第一次更新audit_department.head_id时抛出Error("fetch failed"),后续调用正常执行。