Я борюсь с проблемой с методом saveChanges.Breeze EntityManager не меняет состояние объекта после вызова saveChanges
Кажется, что saveChanges оставляет состояние сущности, как было раньше, и изменения, сделанные на сервере, не отражаются на клиенте из-за этого. Я пробовал обе стратегии слияния, и результат тот же.
я инициализировать менеджер так:
var manager = new breeze.EntityManager({ serviceName: serviceUrl });
Тогда я получаю все объекты, которые я должен работать с параллельными вызовами.
manager.fetchMetadata()
.then(function() {
store.registerEntityTypeCtor("GameGroup", GameGroup);
store.registerEntityTypeCtor("Game", Game);
store.registerEntityTypeCtor("LimitGroup", LimitGroup, LimitGroupInitializer);
store.registerEntityTypeCtor("Limit", Limit, LimitInitializer);
addValidators();
subscribeToStateChanges();
})
.then(function() {
return Q.all([
getEntitiesByQuery(gamesQuery, model.games),
getEntitiesByQuery(gameGroupsQuery, model.gameGroups),
getEntitiesByQuery(limitsQuery, model.limits),
getEntitiesByQuery(limitGroupsQuery, model.limitGroups)]);
})
.then(function() {
handlers.onSuccess();
})
.fail(function() {
handlers.onFail();
});
function getEntitiesByQuery(query, modelProperty) {
manager.executeQuery(query)
.then(function (data) {
modelProperty(data.results);
});
}
Но предположим, что мы хотим изменить свойство какого-то лица: Вот лог консоли:
manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
"Unchanged"
manager.getEntities('LimitGroup')[0].Name('SomeName')
LimitGroup
manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
"Modified"
manager.hasChanges()
true
manager.saveChanges().done();
undefined
manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
"Modified"
Как вы можете видеть, это состояние по-прежнему «Modified» после SaveChanges вызова. Изменения в имени, которое я сделал, были сохранены в базе данных, и все, за исключением, похоже, работает нормально. То же самое происходит с «добавленными» сущностями, однако, если я вызову метод setDeleted для какого-либо объекта, он будет установлен как «Отдельно» сразу после вызова и нигде не будет найден в кеше менеджера.
Я рассмотрел несколько примеров бриза, и у них нет той же проблемы, что может быть проблемой?
Спасибо!
Update # 1
Вот как SaveChanges называется:
self.showBusy();
manager.saveChanges()
.then(function (data) {
self.hideBusy();
console.log(manager.getEntities('LimitGroup')[0].entityAspect.entityState.name);
})
.fail(saveFailed);
Опять же, состояние объекта отображается как 'Modified'
Update # 2
Поэтому я заменил then() вызовом done(), и результат будет таким же.
manager.saveChanges()
.done(function(data) {
self.hideBusy();
console.log(manager.getEntities('LimitGroup')[0].entityAspect.entityState.name);
});
Ваш .then() выполнен до того, как Breeze сохранил изменения и обновил объекты в кеше. Вам нужно использовать .fin() или .done(), поскольку они будут ждать, пока все будет завершено до обработки кода, как показано в моем ответе. –
Это не помогло. –