breeze.js和独立交易

时间:2014-01-02 02:46:25

标签: transactions entity breeze

我需要在更大范围的SaveChanges之外做更小的SaveChanges,我希望能够独立于较大的事务保存较小的事务。示例:用户正在创建包含订单项的订单。典型的父/子购物车。所有“订单”实体都被创建/保存为1个SaveChange事务。当用户在网站上时,他可以选择产品并将其标记为“最喜欢的”。那时我想将该事务保存到完全独立于订单的DB(可能保存也可能不保存)。这是多管理器架构的情况吗?还是多数据信息?我不太确定两者之间的差异。这种工作流程是否有最佳实践?如果重要的话,我正在使用Durandal 2.0,我正在遵循我的datacontext对象的单例设计模式。

1 个答案:

答案 0 :(得分:0)

可以提出论据 ...或许应该 ... ...您的工作流程不允许用户同时收藏Product并构建一个新的Order并保留两个更改并共享相同的EntityManager。这对我来说似乎是不明智的。

但是Breeze确实支持部分保存(“樱桃选择保存”),如果您有充分的理由,可以利用该功能。

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

构建该集合的方法很多。对于KO应用程序,这样的事情可能会起作用(警告:未经测试)

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
}

Product的收藏不会成为此交易的一部分,并且仍将是缓存中的待定更改。

小心

当采摘樱桃时,您有可能忽略应该成为交易一部分的实体变更。

例如(可能是一个不好的例子),其中一个新订单商品可能会引用您尚未保存的新Product

这是一个糟糕的例子,因为您的UI可能不应该以这种方式工作。我不喜欢添加Product并在Order同时或甚至在同一工作流程中使用它。如果您尝试过这样的事情,我想认为服务器会引发参照完整性异常。

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