Acumatica Graph扩展重写Persist方法时调用base.Persist()的问题求助
解决Acumatica Graph扩展中Persist方法重写的无限循环与逻辑缺失问题
你在重写POReceiptEntry的Persist方法时遇到的两难问题,其实是对Acumatica的PXOverride模式和Graph生命周期逻辑理解出现了偏差,我来帮你理清思路并给出解决方案:
问题根源拆解
- 直接调用
Base.Persist()会触发你重写的Persist方法,形成无限递归循环——因为Acumatica的Graph方法调用会优先触发扩展中的重写逻辑。 - 注释掉
baseMethod()则会完全跳过原POReceiptEntry内置的Persist逻辑,包括核心的数据库持久化步骤,导致数据根本无法保存到库中。
正确实现方案
在PXOverride模式下,必须通过传入的baseMethod委托调用原方法,这才是触发原生Persist逻辑的正确方式。如果你想移除特定验证,应该在调用baseMethod()之前暂时禁用这些验证,调用完成后再按需恢复。
代码示例(针对移除特定验证场景)
假设你要移除的是收货行数量字段的必填验证,代码可以这样写:
public class POReceiptEntryExt : PXGraphExtension<POReceiptEntry> { public delegate void PersistDelegate(); [PXOverride] public void Persist(PersistDelegate baseMethod) { // 步骤1:暂时禁用目标验证(以POLine.ReceiptQty的必填验证为例) Base.poLines.Cache.Suppress<PXRequiredAttribute>(typeof(POLine.receiptQty)); try { // 步骤2:调用原生Persist逻辑(包含数据库保存,不会触发无限循环) baseMethod(); } finally { // 步骤3:恢复被禁用的验证(保证后续操作的逻辑完整性) Base.poLines.Cache.Unsuppress<PXRequiredAttribute>(typeof(POLine.receiptQty)); } // 你的自定义清理逻辑 Base.poLinesSelection.Cache.Clear(); Base.openOrders.Cache.Clear(); } }
额外说明
如果你的需求是完全跳过原生Persist中的所有验证(不推荐,可能破坏业务逻辑完整性),也可以直接调用缓存的底层持久化方法,但需要手动处理所有数据的状态:
// 仅作为极端场景参考,不建议随意使用 Base.poLines.Cache.Persist(PXDBOperation.Insert); Base.poLines.Cache.Persist(PXDBOperation.Update); Base.poLines.Cache.Persist(PXDBOperation.Delete);
优先推荐的还是「禁用指定验证+调用原生委托」的方式,既能保留核心的数据库保存和业务逻辑,又能精准移除你不需要的验证步骤。
内容的提问来源于stack exchange,提问作者DanielMoncadaZ
相关产品推荐
相关产品推荐

