2014 年 10 月 8 日更新
我坚持我最初的建议,以避免挑剔的变化。
但是,如果您必须这样做,@utopik 的评论提醒我,微风实验室有getEntityGraph
插件,可以使此类场景变得更加容易。
在微风本身之后安装getEntityGraph.js插件脚本。然后你应该可以说:
// get flat array of cust and its orders
var graph = manager.getEntityGraph(newCustomer,'Orders');
manager.saveChanges(graph);
您必须明确声明应使用轻而易举的“扩展”子句语法包含哪些导航路径。
这种方法会将已更改和未修改的图形实体发送到服务器。您可以过滤掉未更改的:
var changes = manager
.getEntityGraph(newCustomer,'Orders')
.filter(function(entity){
return !entity.entityAspect.entityState.isUnchanged();
});
manager.saveChanges(changes)
getEntityGraph
有朝一日可能会成为核心产品。在那之前,有微风实验室。
原始答案
很好的问题,BP。您对省略应该保存的实体的担忧是我们不鼓励调用的原因saveChanges(array-of-entities)
。常规的、安全的做法就是调用saveChanges()
. 这将在单个事务中保存每个具有待处理更改的实体。
我们为您需要挑选应该保存的实体的特殊情况提供选择性保存重载(您尝试过的那个)。执行此操作时必须小心;您不想孤立相关实体……例如您添加到新客户的新订单。犯错真的很容易……正如您正确指出的那样。
我可以看到您希望 Breeze 推断它应该包含父客户的子订单。但你是在让 Breeze 猜测你真正想要做什么。如果 Breeze 从newCustomer
每条导航路径的每个分支沿着 cookie 追踪,谁知道它会保存什么……或不保存?我们为您提供挑选樱桃的选择;现在你有责任准确说出你的意思。
如果你真的需要保存 thenewCustomer
和它的命令,你可以这样写:
var entityToSave = newCustomer.Orders().slice(); // 确保它是一个副本!
entityToSave.push(newCustomer); // 也添加 newCustomer。
manager.saveChanges(entitiesToSave); // 保存 newCustomer 及其订单。
但我求你避免这种方法。如果您发现自己经常需要保存带有更改的实体子集,我敦促您重新检查您的工作流程。也许您需要多个管理器……如此处所述。