我目前正在编写一个需要离线功能的移动应用程序。
我有两个微风语境,一个主人和一个沙箱。两者共享相同的模型和元数据(使用[BreezeController]从EF6生成)。
现在单个沙箱已足够,但如果所需工作流程数量增加,则可能需要多个沙箱。
沙箱上下文是主上下文的完整克隆,以及可以使用沙箱上下文更改数据的所有工作流。当用户保存沙箱时,这会导出已更改的状态实体并导入到主上下文中。
当用户继续他们的旅程时,主上下文轮询服务器以进行连接(并且通常会失败)。如果找到连接,则主上下文将其数据保存回服务器。因此,将主状态持久保存到持久性存储,但不会由用户当前工作流导致沙箱中的任何已更改数据。
我需要帮助的地方是这个保存发生的时候我需要更新沙箱上的id映射。 (例如,用户当前正在工作流程中向沙箱customerId中的新客户添加订单:-2。后台的主上下文设法将客户更新-2保存到[34]。但是沙箱保留了客户的ID :-2。)
我希望有人能够提出最好的方法来做到这一点。我考虑过了:
首先:
订阅主上下文中已更改的实体,并在实体ID更改时更新沙箱。 (不是很干净)
datacontext.manager.entityChanged.subscribe(function (changeArgs){
/*look for the changes to the id and import the relevant entities*/
})
第二
编写自定义数据服务适配器来处理此问题。虽然这看起来有点矫枉过正。但如果是最好的选择,我们将乐意接受这一点。
第三(如果可能的话,更可取)
在主上下文中,更改成功事件将获取saveResult并应用于沙箱上下文。
function(){
return manager.saveChanges()
.then(saveSucceeded)
.fail(saveFailed)
function saveSucceeded(saveResult) {
/* Apply the saveResult to the sandbox */
}
}
如果采用上述方法之一或完全不同的方式,任何有关解决此问题的最佳方法的建议都将受到赞赏。
备注
我理解这不是微风中多个上下文的建议模式,因为建议的模式将沙箱连接到持久存储然后更新主服务器。但是,在我的情况下,这种机制并不是最好的选择,因为我必须使用导出数据功能进行离线处理以及我的主上下文中所需的连接找到功能。
将此问题与错误相关联的问题(从上面的示例继续)用户保存他们的沙箱(导出回主人)如果主人设法保存到持久存储,那么主人现在有2个实体表示同一客户的上下文。这些是客户-2和客户34.由于导航属性,这导致:
乐观并发异常
当调用mastercontext.saveChanges()时来自EF。