微风和SQL服务器触发器



Breeze不知道保存这些数据时服务器端的数据发生了什么变化。微风团队说,你必须重新查询有更新的数据。在此保存期间同步完成的操作,如sql触发器(expl)。插入之后)可以考虑,因为这些操作可以在保存过程中转换实体,因此它们发生在客户端:这对于不是由Breeze生成的新密钥(如多部分密钥)很有用。我很难解决这个问题。帮助吗?

更新1:

如果这是Breeze的原理,那它可能是一个bug。

1)触发器(在服务器端)是实体(表)的一部分

2)使用的框架:
  • 服务器端框架:.NET framework 4.5
  • 客户端框架:Breeze 1.3.5
  • 视图框架:knockout 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);
        }
    }

注:: SQL触发器插入的所有值都是不可见的,除非你从服务器重新调用实体,而不是从缓存;似乎是一个变通的办法,而不是我想的解决方案。

更新2:

我认为Breeze认为我的返回实体像OData

1)从我的微风Api控制器,我使用这个:

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

2)微风说:对于OData,服务器端计算字段值的任何更改在更新后将无法在Breeze中使用。如果您需要刷新这些值,您必须请求…

3)所以从现在开始,我的解决方案是REQUERY(不是好消息)来获得我的计算或触发结果。希望未来的beforeaveentity拦截器能够解决这个问题。或者我如何获得纯实体的微风(不是OData,但计算或触发服务器端)?有办法摆脱这个麻烦吗?

Breeze EFContextProvider重新查询它保存的实体并将它们发送回客户端。因此,如果SQL触发器更新了被保存的实体,它将把由SQL触发器更新的值发送回客户机。例如,如果您保存实体'A',并且触发器更新了实体'A'的值,则EFContextProvider将重新查询'A'并将更新的值发送给客户端。

让我们知道如果你能证明这是不是真的。我相信这是一个bug。

微风不知道…我不知道……关于其他由SQL触发器更新的实体。当您保存实体'A'时,Breeze无法知道实体'B'已被触发器更新,因此没有理由查询'B'并将其发送给客户端。

相关内容

  • 没有找到相关文章

最新更新