2015-12-28 33 views
0

我已經使用兩個實體管理器實現了存儲庫模式, mainManager用於只讀和刪除,updateManager用於編輯和添加新實體。我使用createEmptyCopy()來創建updateManager。如何在兩個實體管理器之間用微風保存更改後導入實體

在更新實體之前,我從mainManager中導出實體並導入到updateManager中,更改後我調用updateManager.saveChanges()方法。

我注意到我找回了promise中更新的實體。我想知道將這些實體導入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 }); 
相關問題