2013-10-08 3 views
1

Я борюсь с проблемой с методом 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); 
      }); 
+0

Ваш .then() выполнен до того, как Breeze сохранил изменения и обновил объекты в кеше. Вам нужно использовать .fin() или .done(), поскольку они будут ждать, пока все будет завершено до обработки кода, как показано в моем ответе. –

+0

Это не помогло. –

ответ

0

Проблема заключалась в том, что я не отмечал контроллер api с атрибутом BreezeController.

1

Следующий код не действует, потому что вы должны передать функцию в проделанного вызова, а затем проверить entitiesState с этого момента, когда обратный вызов принимается.

manager.saveChanges().done(checkStates); 

function checkStates() { 
    manager.getEntities('LimitGroup')[0].entityAspect.entityState.name 
} 

Это приведет к возврату обратного вызова saveChanges перед проверкой entityState.

+0

Нет, он все еще указывает, что объект изменен. В вопросе есть вызовы, сделанные в консоли браузера, поэтому к тому времени, когда я сделал следующий вызов, saveChanges был закончен. –

+0

Откуда вы это знаете? –

+0

Я взглянул на сетевые коммуникации и немного подождал. В реальном коде я жду с обещанием saveChanges завершить. Ознакомьтесь с обновлением. –

Смежные вопросы