Acumatica中Graph.Caches属性操作其他DAC的正确使用方法咨询
在Acumatica中使用
graph.Caches[typeof(MyDac)]操作其他DAC值的正确方式 我经常在Acumatica开发工作里用到graph.Caches[typeof(MyDac)]来处理非当前Graph主视图的DAC,这里给你梳理下正确的使用姿势,以及你关心的几个核心问题解答:
操作其他DAC的标准流程
不管目标DAC是否被添加到当前Graph的任何视图中,你都可以通过Caches集合来安全地操作它的记录,步骤如下:
- 获取目标DAC的缓存实例:
var dacCache = graph.Caches[typeof(MyDac)]; - 获取或创建DAC记录:
- 加载已有记录(通过主键值定位):
var existingRecord = dacCache.SelectSingle<MyDac>(primaryKey1, primaryKey2); - 创建新的记录实例:
var newRecord = (MyDac)dacCache.CreateInstance(); // 给新记录的必填字段赋值 newRecord.PKField = someValue; newRecord.OtherField = "Initial Value";
- 加载已有记录(通过主键值定位):
- 修改记录并标记状态:
- 更新已有记录:修改字段后调用
Update标记缓存变更existingRecord.TargetField = "Updated Value"; dacCache.Update(existingRecord); - 新增记录:调用
Insert将新记录加入缓存dacCache.Insert(newRecord); - 删除记录:调用
Delete标记记录为待删除dacCache.Delete(existingRecord);
- 更新已有记录:修改字段后调用
是否需要立即持久化?
不需要手动调用Persist()这类立即持久化的方法,除非你的业务逻辑需要在当前操作流程中途就把变更写入数据库(比如后续步骤依赖这个已持久化的数据)。
正常情况下,当你调用graph.Action.PressSave()时,Acumatica会自动遍历当前Graph所有Caches集合里的变更——不管对应的DAC是否在Graph的视图中——把所有标记为新增、更新、删除的记录批量持久化到数据库。
关于DAC未在Graph视图中的疑问
即使目标DAC没有被添加到当前Graph的任何PXSelect视图中,只要你通过graph.Caches[typeof(MyDac)]操作了它的记录并正确标记了变更状态,PressSave()时依然会将这些变更保存到数据库。
这里有个小细节需要注意:如果该DAC有自定义的业务逻辑事件(比如RowPersisting、RowUpdated),只有当前Graph订阅了这些事件时才会触发;如果当前Graph没有订阅,原DAC所属Graph的事件不会自动触发,这点在复杂业务场景下要格外留意。
简单示例代码
// 在某个自定义Graph中更新另一个独立DAC的记录 public void UpdateRelatedRecord(int targetPK) { var orderCache = Base.Caches[typeof(SalesOrder)]; var targetOrder = orderCache.SelectSingle<SalesOrder>(targetPK); if (targetOrder != null) { targetOrder.OrderStatus = OrderStatus.Completed; orderCache.Update(targetOrder); // 无需手动Persist,等待PressSave统一提交 } }
内容的提问来源于stack exchange,提问作者Stan A
相关产品推荐
相关产品推荐

