如何使用EntityManager的saveChanges()方法保存单个实体?

Ber*_*eco 4 javascript breeze

假设我有以下数据结构:具有Orders集合(1到n关系)的Customer实体.因此,返回零个或多个订单的数组.Customer.Orders()

现在,我创建一个新的Customer newCustomer和一个新的Orders实体数组.此Orders实体数组已分配给Customer.所有实体都具有"已添加"实体状态.

然后,我打电话saveChanges()如下:

manager.saveChanges([newCustomer])
Run Code Online (Sandbox Code Playgroud)

我用saveChanges()[entities]根据本文档参数:http://www.breezejs.com/sites/all/apidocs/classes/EntityManager.html#method_saveChanges

我希望它newCustomer和它的Orders数组都会保存在服务器中,但只 newCustomer 保存了.

有没有办法保存newCustomer及其Orders数组?也许我可以传递[entities]参数中的所有实体,但这将是冗长和一点错误.我知道我可以只调用saveChanges()方法来保存的所有实体,但我想保存只有彻底特定的实体.

提前致谢,

贝尔纳多帕切科

War*_*ard 6

2014年10月8日更新

我坚持我的原始建议,以避免挑选樱桃.

但是如果你必须的话,@ utopik的评论提醒我,微风实验室有这个getEntityGraph插件可能会使这种情况变得相当容易.

在breeze本身之后安装getEntityGraph.js插件脚本.然后你应该可以说:

// get flat array of cust and its orders
var graph = manager.getEntityGraph(newCustomer,'Orders'); 
manager.saveChanges(graph);   
Run Code Online (Sandbox Code Playgroud)

您必须使用breeze"expand"子句语法明确说明应包含哪些导航路径.

此方法将已更改和未修改的图形实体发送到服务器.您可以过滤掉未更改的那些:

var changes = manager
    .getEntityGraph(newCustomer,'Orders')
    .filter(function(entity){
        return !entity.entityAspect.entityState.isUnchanged();
    }); 

manager.saveChanges(changes)
Run Code Online (Sandbox Code Playgroud)

getEntityGraph有一天可能会成为核心产品.在那之前,有微风实验室.

原始答案

优秀的问题,BP.您对省略应保存的实体的担忧是我们不鼓励打电话的原因saveChanges(array-of-entities).例行公事,安全的事情就是打电话saveChanges().这将保存每个具有挂起更改的实体在单个事务中.

我们为特殊情况提供选择性保存重载(您尝试过的重载),您需要在其中选择应保存的实体.你这样做时一定要小心; 您不希望孤立相关实体...例如您添加到新客户的新订单.如你正确地指出的那样,犯错很容易.

我可以看到你希望Breeze推断它应该包含与父客户的子订单.但是你要求Breeze猜测你真正想要做什么.如果Breeze遵循cookie路径newCustomer每条导航路径的每个分支路径,谁知道它会保存什么......或者不保存?我们为您提供樱桃选择; 现在你有责任准确地说出你的意思.

如果你真的需要保存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.

但我求求你避免这种做法.如果您发现自己经常处于需要保存实体子集的位置,我建议您重新检查您的工作流程.也许您需要多个经理...... 如此处所述.