不允许并发保存:breeze错误

时间:2014-01-13 19:25:05

标签: breeze savechanges

  vm.alterExistingSortOrder = function () {

        $.each(vm.M1010DxCodeSorterListBox2(), function (index1, value1) {


            if (vm.M1010DxCodeSorterListBox2()[index1].IsNewDxCode == false)
            {
                 return datacontext.fetchEntity("EpisodeDxM00Rel", vm.M1010DxCodeSorterListBox2()[index1].Id).then(function (result) {
                    var episodeDxM00RelEntity = result.entity;
                    episodeDxM00RelEntity.SortOrder(index1);
                    vm.save();
                });

            }

        });


        $.each(vm.M1016DxCodeSorterListBox2(), function (index2, value2) {


            if (vm.M1016DxCodeSorterListBox2()[index2].IsNewDxCode == false)
            {
                 return datacontext.fetchEntity("EpisodeDxM00Rel", vm.M1016DxCodeSorterListBox2()[index2].Id).then(function (result) {
                    var episodeDxM00RelEntity = result.entity;
                    episodeDxM00RelEntity.SortOrder(index2);
                    vm.save();
                });

            }

        });
};

我有一个函数,其中我有8个for循环(在代码示例中我只显示2个循环)。我在该循环中获取实体,并更改其中一个属性。理想情况下,我想将所有实体保存在一起,而不是一个接一个地保存,我目前正在做,这给了我并发保存错误,但我不知道如何将所有这些修改过的实体保存在一起(我应该在哪里写一个保存方法调用,考虑到fetchEntity方法返回了多个promise)

1 个答案:

答案 0 :(得分:2)

Breeze确实支持并发保存,但您需要通过 SaveOptions 类明确启用此功能:http://www.breezejs.com/sites/all/apidocs/classes/SaveOptions.html

myEntityManager.saveOptions = new SaveOptions({ allowConcurrentSaves: true });
myEntityManager.saveChanges().then(...);

也就是说,重构/重写代码可能更有意义,这样您就可以使用多个实体执行单个保存。查看Q.all方法(https://github.com/kriskowal/q),了解如何编写在执行所有提取后执行的保存承诺。