Transactions breeze.js与独立交易

Transactions breeze.js与独立交易,transactions,entity,breeze,Transactions,Entity,Breeze,我需要在更大的范围SaveChanges之外进行更小的SaveChanges,并且我希望能够独立于较大的事务保存较小的事务。例如:用户正在使用行项目创建订单。典型的父母/孩子购物车。所有“订单”实体都将创建/保存为1个SaveChange事务。当用户在站点上时,他可以选择一个产品并将其标记为“最喜爱”。当时,我希望将该事务保存到DB,完全独立于订单(可能保存,也可能不保存)。这种情况是否适用于mutli manager体系结构?还是多数据上下文?我不太清楚两者之间有什么区别。这种工作流程是否有最

我需要在更大的范围SaveChanges之外进行更小的SaveChanges,并且我希望能够独立于较大的事务保存较小的事务。例如:用户正在使用行项目创建订单。典型的父母/孩子购物车。所有“订单”实体都将创建/保存为1个SaveChange事务。当用户在站点上时,他可以选择一个产品并将其标记为“最喜爱”。当时,我希望将该事务保存到DB,完全独立于订单(可能保存,也可能不保存)。这种情况是否适用于mutli manager体系结构?还是多数据上下文?我不太清楚两者之间有什么区别。这种工作流程是否有最佳实践?如果有关系的话,我正在使用Durandal 2.0,并且我正在遵循datacontext对象的单例设计模式。

这个参数可能是。。。也许应该。。。您的工作流不应允许用户同时喜爱
产品
和生成新的
订单
,并且不保存这两项更改并共享同一
EntityManager
。那对我来说似乎是不明智的

但是Breeze确实支持部分保存(“cherry pick saves”),如果有充分的理由,您可以利用该功能

EntityManager.saveChanges
方法的第一个参数是要保存的可选实体数组,因此您可以选择在事务中保存哪些实体

有很多方法可以建立这个集合。类似这样的KO应用程序可能会起作用(注意:未经测试)

产品
的优惠将不属于此事务的一部分,并且将仍然是缓存中挂起的更改

小心点

在挑选时,您可能会忽略一个应属于交易一部分的具有更改的实体

例如(可能是一个坏例子),一个新订单项可能引用了一个您尚未保存的新产品

这是一个糟糕的例子,因为您的UI可能不应该以这种方式工作。我不喜欢添加
产品
,并在
订单
中同时或甚至在同一工作流中使用它。如果您尝试这样做,我想服务器会抛出一个引用完整性异常


但你明白我的意思,对吗?您必须确保您的保存选择中包含所有正确的内容。

我真的不喜欢采摘樱桃的想法。我希望它是孤立的。我可以看到这个应用在很多地方。假设用户有一个未保存的购物车,但在结账之前,他们需要进入他们的客户档案并更新他们的电子邮件地址、抄送信息等。他们应该能够在保持购物车不变的情况下更新他们的档案数据,更新档案后,他们可以继续购物。(配置文件数据已提交)。用户可能永远无法完成订单。我读过关于多个经理的书。这行得通吗,还是樱桃是唯一的选择?感谢多位管理者确实有效,事实上,他们是首选。我只是说,如果需要,可以使用部分保存。旁注:确保您的经理共享相同的
元数据存储
,这样您就不会对元数据进行冗余的服务器访问。看见
function saveOrderById(order){
    // get the order's items with pending changes
    var itemsWithChanges = order.orderItems().filter(
        function(item) { return item.entityAspect.isAddedModifiedOrDeleted()});
    // concatenate with the order itself (you may have a concurrency property to set, btw)
    var savables = itemsWithChanges.concat(order)
    return order.entityAspect.entityManager.saveChanges(savables); // returns the promise
}