Breeze не сохраняет правильное значение (которое установлено в коде) при сохранении во время события entityChanged

У меня есть Breeze, Typescript, MVC 5.2, Knockout, веб-приложение Entity Framework. Я пытаюсь обновить значение сущности User, когда пользователь щелкает строку в сетке (kogrid). Значение (должно быть) сохранено в обработчике событий entityChanged, но в Fiddler я вижу, что значение свойства не изменилось, и для entityAspect.entityState задано значение Modified (!). OriginalValuesMap имеет старый TenantId и является единственным значением в карта.

Я подписываюсь на событие измененного объекта следующим образом:

this.EntityManager.entityChanged.subscribe((data: breeze.EntityChangedEventArgs) => {
    if (data.entityAction == breeze.EntityAction.PropertyChange) {
                return this.EntityManager.saveChanges(<breeze.Entity[]> new Array(data.entity))
                    .fail((error) => alert("Failed. " + error));}

        });

Данные поступают правильно в обработчик событий. Выполнен вызов savechanges, но измененное значение (tenantId) не изменилось.

Обработчик события для щелчка строки выглядит следующим образом:

ViewModel).OnRowClick = (tenantId: KnockoutObservable<System.IGuid>, viewModel: Imp.Scripts._TenantListViewModel) => {
        entityManager.fetchEntityByKey("User", viewModel.Settings().CurrentUser().UserId(), false)
        .then(entityKeyResult => {
            (<Imp.Classes.UserBreeze>entityKeyResult.entity).CurrentTenantId(tenantId());
            //entityManager.saveChanges(<breeze.Entity[]> new Array(entityKeyResult.entity));
         })
        .fail((error)=> alert("Error setting current tenant. " + error));});

Когда я отключаю подписку entityChanged и включаю строку комментария entityManager.saveChanges.... сущность сохраняется правильно. Если я раскомментирую строку, но сохраню подписку, она не будет работать.

Как я могу автоматически сохранить измененную сущность после ее изменения?

РЕДАКТИРОВАТЬ: Обходной путь - временно отключить обработчик событий entityChanged перед изменением значения CurrentTenantId для текущего пользователя, сохранить объект вручную и повторно подписаться на событие entityChanged. Но это решение пахнет.

1 ответ

Решение

Несколько предложений:

  1. Подумайте об ограничении сохранений, если события с измененным свойством запускаются часто. Нокаут имеет ограничитель скорости для этой цели.
  2. Возможно, вы захотите использовать плагин breeze save queueing, чтобы вам не приходилось беспокоиться о перекрывающихся вызовах сохранения.
  3. Чтобы устранить проблему сохранения, попробуйте добавить следующий код непосредственно перед вызовом saveChanges:

if (data.entityAction === breeze.EntityAction.PropertyChange) { var pcArgs = <breeze.PropertyChangedEventArgs>data.args; console.log('Property Changed. PropertyName: ' + pcArgs.propertyName + '; Old Value: ' + (pcArgs.oldValue ? pcArgs.oldValue.toString() : 'null') + '; New Value: ' + (pcArgs.newValue ? pcArgs.newValue.toString() : 'null') + ';'); }

Другие вопросы по тегам