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'并将其发送给客户端。