如何在两个实体管理器中使用 breeze 保存更改后导入实体

How to import entities after save changes with breeze across two entity managers

我已经用两个实体管理器实现了存储库模式, mainManager 用于只读和删除,updateManager 用于编辑和添加新实体。我使用 createEmptyCopy() 创建 updateManager.

在我更新实体之前,我从 mainManager 中导出实体并导入到 updateManager 中,在更改之后我调用了 updateManager.saveChanges() 方法。

我注意到我在承诺响应中取回了更新后的实体。我想知道将这些实体导入回 mainManager 的最佳做法是什么?

这是我的代码:

function ($q, $http, entityManagerFactory) {
    var self = this;

    self.mainManager = entityManagerFactory.newManager();
    self.updateManager = entityManagerFactory.newManager();

    self.saveChanges = function () {
        return self.updateManager.saveChanges();
    };

    self.rejectChanges = function() {
        self.updateManager.rejectChanges();
    };

    self.getDomains = function () {
        self.mainManager.clear();

        var query = new breeze.EntityQuery()
            .from('Domains')
            .orderBy('name');

        return self.mainManager.executeQuery(query);
    };

    self.createEmptyDomain = function () {
        var domain = self.updateManager.createEntity('Domain');

        return domain;
    };

    self.editDomain = function(domain) {
        var exported = self.mainManager.exportEntities([domain]);
        return self.updateManager.importEntities(exported).entities[0];
    }

    self.addDomain = function (domain) {
        self.updateManager.addEntity(domain);
        return self.updateManager.saveChanges();
    };

    self.deleteDomain = function (domain) {
        domain.entityAspect.setDeleted();
        var deferred = $q.defer();
        self.mainManager.saveChanges().then(
            function(data) {
                deferred.resolve(data);
            },
            function (reason) {
                console.log(reason);
                self.mainManager.rejectChanges();
                deferred.reject(reason);
            });

        return deferred.promise;
    };
}

现在我正在调用 mainManager.clear() 并再次从服务器获取数据,如您在上面的 getDomains 函数中所见。 但我认为这太庞大了,如果我已经从 saveChanges 承诺中获得更新的实体,为什么还要调用服务器?

我还尝试使用以下方法将这些实体导入回 mainManager:

mainManager.importEntities(data.entities, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });

但我得到一个内部空 breeze 异常:

TypeError: Cannot read property 'forEach' of undefined
    at EntityManager.proto.importEntities (breeze.debug.js:13081)
    at self.importEntities (domain-list.service.js:22)
    at domain-list.controller.js:70
    at processQueue (angular.js:13170)
    at angular.js:13186
    at Scope.promises.$get.Scope.$eval (angular.js:14383)
    at Scope.promises.$get.Scope.$digest (angular.js:14199)
    at Scope.promises.$get.Scope.$apply (angular.js:14488)
    at done (angular.js:9646)
    at completeRequest (angular.js:9836)

错误来自这一行 breeze.debug.js:13081

13080: var tempKeyMap = {}; 
13081:     json.tempKeys.forEach(function (k) { 
13082:       var oldKey = EntityKey.fromJSON(k, that.metadataStore); 
13083:       // try to use oldKey if not already used in this keyGenerator. 13084:       tempKeyMap[oldKey.toString()] = new EntityKey(oldKey.entityType, 
13085: that.keyGenerator.generateTempKeyValue(oldKey.entityType, oldKey.values[0])); 
13086:     });
var exportData = updateManager.exportEntities(data.entities, false);
                 mainManager.importEntities(exportData,
                    { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });