2015-12-28 10 views
0

Я реализовал шаблон репозитория с двумя менеджерами сущностей, 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 }); 

, но я получаю внутреннее исключение нулевой ветер:

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:  }); 

ответ

1
var exportData = updateManager.exportEntities(data.entities, false); 
       mainManager.importEntities(exportData, 
        { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });