假设我有以下数据结构:客户实体,其中包含订单(1到n关系)的集合。因此,Customer.Orders()
会返回零个或多个订单的数组。
现在,我创建了一个新的客户 newCustomer
,以及一个新的订单实体数组。此订单实体数组已分配给客户。所有实体都具有“已添加”实体状态。
然后,我按如下方式致电saveChanges()
:
manager.saveChanges([newCustomer])
我根据此文档使用了saveChanges()
的{{1}}参数:http://www.breezejs.com/sites/all/apidocs/classes/EntityManager.html#method_saveChanges
我希望[entities]
及其订单数组都会保存在服务器中,但只有 newCustomer
得救了。
有没有办法保存newCustomer
及其订单数组?也许我可以传递newCustomer
参数中的所有实体,但这将是冗长的并且是一个错误点。我知道我只能调用[entities]
方法来保存所有实体,但我想完全保存 特定实体。
提前致谢,
Bernardo Pacheco
答案 0 :(得分:6)
我坚持我原来的建议,以避免采摘樱桃。
但如果你必须,我会被@ utopik的评论提醒我breeze labs has the getEntityGraph
plugin可能会使这种情况变得相当容易。
在breeze本身之后安装 getEntityGraph.js 插件脚本。然后你应该可以说:
// get flat array of cust and its orders
var graph = manager.getEntityGraph(newCustomer,'Orders');
manager.saveChanges(graph);
您必须使用breeze“expand”子句语法明确声明应包含哪些导航路径。
此方法会将已更改和未修改的图形实体发送到服务器。你可以过滤掉未改变的那些:
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路径,谁知道它会保存什么......或者不保存?我们为您提供樱桃选择;现在你有责任准确地说出你的意思。
如果您确实需要保存newCustomer
及其订单,可以写下:
var entitiesToSave = newCustomer.Orders().slice(); // Make sure it's a copy! entitiesToSave.push(newCustomer); // add the newCustomer too. manager.saveChanges(entitiesToSave); // save newCustomer and its orders.
但我请求你避免这种做法。如果您发现自己经常处于需要保存实体子集的位置,我建议您重新检查您的工作流程。也许你需要多个经理...... as described here。