breeze实体被不必要地缓存

时间:2017-09-07 15:40:04

标签: caching asp.net-web-api breeze entities

我有一个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];
        }

以下是发生的事件序列。

  1. 调用“UserInfo”API调用并在页面上显示用户信息。
  2. 对data.user.userWorkLocations1进行修改(我将一个UserWorkLocation对象添加到集合中,所以它现在有3个userworklocations)并保存。
  3. 转到其他页面并执行一些CRUD操作,从该用户的WorkLocation列表中删除一个UserWorkLocation。
  4. 我确保在数据库中验证此用户只有两个userworklocations。
  5. 再次调用“UserInfo”API调用并在页面上显示用户信息。
  6. 问题是 - 在第二个UserInfo API调用中,在微风查询端,我可以看到3个userWorkLocation对象(参见截图)。 enter image description here

    但是我检查了开发人员工具的响应,响应中只有两个userWorkocation对象(参见截图)。 enter image description here

    这是删除#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个对象,另外一个是我删除的对象。可能缓存?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

使用Breeze的正常流是在客户端上发生删除并传送到服务器。这里的问题是Breeze不知道服务器上发生的删除。这是一个典型的缓存一致性问题。

基本上有三种方法可以解决这个问题:

  1. 清除您怀疑已被删除的实体或实体类型的缓存,然后重新查询它们。这种方法在Keeping a fresh cache中进行了深入讨论。

  2. 使用软删除,其中每个实体都有一个标志(在代码和数据库中),表示删除。实体未被真正删除,它们被标记为客户端不显示它们。如果在服务器上删除实体,则当客户端下次查询实体时,“已删除”标志将为真。

  3. 从服务器传达删除。在保存期间,saveResultdeletedKeys属性便于实现,其中一个示例位于Saving Changes页面中。 Breeze EntityManager自动使用deletedKeys删除缓存中的实体。在保存之外,您需要在客户端和服务器之间进行一些其他通信,以通知客户有关删除的信息,例如SignalR。

  4. 每种方法都有其挑战,因此您需要选择最适合您应用的方法。