4

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

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

然后,我调用saveChanges()如下:

manager.saveChanges([newCustomer])

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

我希望 thenewCustomer及其Orders数组都保存在服务器中,但只 newCustomer 保存了 。

有什么方法可以保存newCustomer及其Orders数组吗?也许我可以在[entities]参数中传递所有实体,但这会很冗长并且有一点错误。我知道我只能调用saveChanges()方法来保存所有实体,但我只想完全保存一个特定的实体。

提前致谢,

贝尔纳多·帕切科

4

1 回答 1

6

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 及其订单。

但我求你避免这种方法。如果您发现自己经常需要保存带有更改的实体子集,我敦促您重新检查您的工作流程。也许您需要多个管理器……如此处所述

于 2012-11-27T01:33:50.813 回答