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