0

在保存这些数据时,Breeze 并没有查看服务器端的数据发生了什么。Breeze 团队说你必须重新查询才能有更新的数据。可以考虑在此保存期间同步完成的操作,例如 sql 触发器(expl。插入后),因为这些操作可以在保存期间转换实体,因此它们发生在客户端:这对于不是由 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);
        }
    }

PS:SQL 触发器插入的所有值根本不可见,除非您从服务器而不是从缓存中重新调用实体;似乎是一种解决方法,而不是我想的解决方案。

更新 2: 我认为 Breeze 将我的返回实体视为OData

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

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

2) Breeze 说:使用OData,服务器端计算字段的值的任何更改在更新后将在 Breeze 中不可用。如果您需要刷新这些值,您必须重新查询...

3)所以从现在开始,我的解决方案是请求(不是好消息)来获取我的计算或触发结果。希望 BeforeSaveEntity 拦截器的未来能够解决这个问题。或者我怎样才能获得 Breeze 的纯实体(不是 OData,而是计算或触发的服务器端)?有没有办法摆脱这个麻烦?

4

1 回答 1

0

BreezeEFContextProvider重新查询它保存的实体并将它们发送回客户端。因此,如果这些触发器更新了 entity-being-saved,它会将由 SQL 触发器更新的值发送回客户端。例如,如果您保存实体“A”并且触发器更新实体“A”的值,EFContextProvider则将重新查询“A”并将这些更新的值发送到客户端。

如果您能证明这不是真的,请告诉我们。我相信那将是一个错误。

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

于 2013-06-04T01:50:36.527 回答