我需要在更大范围的SaveChanges之外做更小的SaveChanges,我希望能够独立于较大的事务保存较小的事务。示例:用户正在创建包含订单项的订单。典型的父/子购物车。所有“订单”实体都被创建/保存为1个SaveChange事务。当用户在网站上时,他可以选择产品并将其标记为“最喜欢的”。那时我想将该事务保存到完全独立于订单的DB(可能保存也可能不保存)。这是多管理器架构的情况吗?还是多数据信息?我不太确定两者之间的差异。这种工作流程是否有最佳实践?如果重要的话,我正在使用Durandal 2.0,我正在遵循我的datacontext对象的单例设计模式。
答案 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
同时或甚至在同一工作流程中使用它。如果您尝试过这样的事情,我想认为服务器会引发参照完整性异常。
但你明白我的意思了吧?您必须确定您的保存选择中包含所有正确的内容。