我有一个breeze实体及其导航属性的问题,它通过WebAPI调用填充。
return EntityQuery.from('UserInfo')
.withParameters({ clientId: clientId, userId: userId })
.using(self.manager)
.execute()
.then(querySucceeded, this._queryFailed);
function querySucceeded(data) {
return data.results[0];
}
以下是发生的事件序列。
问题是 - 在第二个UserInfo API调用中,在微风查询端,我可以看到3个userWorkLocation对象(参见截图)。
但是我检查了开发人员工具的响应,响应中只有两个userWorkocation对象(参见截图)。
这是删除#3中用户工作位置的服务器端代码。
if (activeStatus != location.ActiveStatus && location.ActiveStatus == 0)
{
// remove all work location assignments
ClientContext.UserWorkLocations.RemoveRange(ClientContext.UserWorkLocations.Where(u => u.FkLocationId == location.LocationId));
}
ClientContext.SaveChanges();
我在服务器端调用上设置了一个断点,并确保它返回两个。我无法理解微风如何读取集合中的3个对象,另外一个是我删除的对象。可能缓存?我该如何解决这个问题?
答案 0 :(得分:1)
使用Breeze的正常流是在客户端上发生删除并传送到服务器。这里的问题是Breeze不知道服务器上发生的删除。这是一个典型的缓存一致性问题。
基本上有三种方法可以解决这个问题:
清除您怀疑已被删除的实体或实体类型的缓存,然后重新查询它们。这种方法在Keeping a fresh cache中进行了深入讨论。
使用软删除,其中每个实体都有一个标志(在代码和数据库中),表示删除。实体未被真正删除,它们被标记为客户端不显示它们。如果在服务器上删除实体,则当客户端下次查询实体时,“已删除”标志将为真。
从服务器传达删除。在保存期间,saveResult的deletedKeys
属性便于实现,其中一个示例位于Saving Changes页面中。 Breeze EntityManager自动使用deletedKeys
删除缓存中的实体。在保存之外,您需要在客户端和服务器之间进行一些其他通信,以通知客户有关删除的信息,例如SignalR。
每种方法都有其挑战,因此您需要选择最适合您应用的方法。