триггеры бриза и sql сервера

Breeze не видит, что произошло с данными на стороне сервера при сохранении этих данных. Команда Breeze сказала, что вы должны повторно запросить обновленные данные. Действия, выполняемые синхронно во время этого сохранения, такие как триггеры sql (например, после вставки), могут быть рассмотрены, поскольку эти операции могут преобразовывать объекты во время сохранения, чтобы они выполнялись на клиенте: это будет полезно для новых ключей, не сгенерированных Breeze, таких как составные ключи. . Мне трудно обойти эту проблему. Помощь?

ОБНОВЛЕНИЕ 1: Если это принцип Breeze, то, вероятно, это ошибка.

1) Триггер (на стороне сервера) является частью сущности (таблицы)

2) Используемые рамки:

  • серверная платформа: .NET Framework 4.5
  • клиентская структура: Breeze 1.3.5
  • структура просмотра: нокаут 2.2.1

3) сценарий результата из saveChanges:

function saveTousRecos() {
    return manager.saveChanges()
             .then(success)
             .fail(fail);
        function success(saveResult) {
            /* do your post-save work here */
            axi = saveResult.entities[0].jobtab();  
        // axi is an identity key generated at server and sent back to client by Breeze
        // result : Breeze value = (195), the same as server-side (195)
            ara = saveResult.entities[0].seqtab();  
        // ara is a property value inserted by sql FOR INSERT trigger, 
        // result : Breeze value = (NULL), server-side has (13)
            logger.log("Saving succeded... ");
        }
        function fail(error) {
            logger.log("Saving failed: " + error.message);
        }
    }

P.S. : все значения, вставленные триггерами SQL, вообще не видны, если вы не вызываете объект повторно с сервера, а не из кеша; кажется обходным решением, а не решением, которое я полагаю.

ОБНОВЛЕНИЕ 2: я думаю, что Breeze рассматривает мои возвращаемые объекты как OData.

1) из моего контроллера Breeze Api я использую это:

return _contextProvider.Context.clients.Where(uc => uc.refclie == rqnoclie);

2) Breeze сказал: с OData любое изменение значения вычисляемого поля на стороне сервера не будет доступно в Breeze после обновления. Если вам нужно обновить эти значения, вы должны повторно запросить...

3) поэтому с этого момента решение для меня - REQUERY (нехорошие новости), чтобы получить мои вычисленные или инициированные результаты. Надеюсь, что будущее перехватчиков BeforeSaveEntity решит эту проблему. Или как я могу получить чистые объекты для Breeze (не OData, а вычисляемые или запускаемые на стороне сервера)? Есть ли способ выбраться из этой беды?


person M.Ouedraogo    schedule 02.06.2013    source источник


Ответы (1)


Breeze EFContextProvider повторно запрашивает сохраненные объекты и отправляет их обратно клиенту. Таким образом, он будет отправлять значения, обновленные триггерами SQL, обратно клиенту, если эти триггеры обновят сохраняемый объект. Например, если вы сохраняете объект «А», а триггер обновляет значение объекта «А», EFContextProvider повторно запросит «А» и отправит эти обновленные значения клиенту.

Дайте нам знать, если вы можете продемонстрировать, что это неправда. Я считаю, что это будет ошибка.

Breeze не знает... и не может знать... о других объектах, обновляемых с помощью триггера SQL. Breeze не может знать, что объект «B» был обновлен триггером, когда вы сохранили объект «A», и у него нет причин запрашивать «B» и отправлять его клиенту.

person Ward    schedule 04.06.2013
comment
@sbelini Спасибо за помощь, Уорд, но я думаю, что трудности останутся. Я обновил свой ответ, пытаясь продемонстрировать, что Breeze не возвращает sql, который запускает обновленные результаты для клиента. Не знаю, баг это или нет. - person M.Ouedraogo; 02.07.2013
comment
Мой комментарий о повторном запросе относится к источнику данных веб-API, а не к источнику данных OData (о котором я очень мало знаю). Мы постараемся воспроизвести то, что вы описываете, и отчитаться. - person Ward; 03.07.2013