У меня есть веб-приложение 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) не изменилось.
Обработчик события для rowclick выглядит следующим образом:
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. Но этот раствор пахнет.