导航属性不会刷新

时间:2014-02-17 22:56:37

标签: javascript caching breeze

我有一个Home实体,我从服务器发送到我的客户端。

public Home {
   public HomeId {get;set;}
   public String Address {get; set;}
   public ICollection<Room> Rooms{ get; set;}
}

客户端的所有数据管理都由BreezeJs处理。

我的网络应用程序是多用户。每当用户更新Home实体时,服务器都会使用SignalR通知所有感兴趣的客户端。 通知客户端时,它会运行以下查询来刷新其缓存:

function refresh(homeId) {
    var query = entityQuery.from('Homes')
                   .withParameters({ homeId: homeId });

    return manager.executeQuery(query)
                  .fail(queryfailed);

    function queryfailed(data) {
        // error
    }
}

服务器端控制器:

    [HttpGet]
    public Home Homes(int homeId)
    {
        var home = _context.Context.Homes
                           .Include(t => t.Rooms)
                           .FirstOrDefault(t => t.HomeId == homeId);
        return home;
    }

问题

刷新Home实体时,所有属性都从服务器获取新值,但不从导航属性获取。如果用户向/从给定Room添加/删除House,则缓存中的相关Rooms实体不会刷新,尽管json数据看起来很好并包含添加/删除Room个实体。

问题

有没有一种简单的方法可以告诉Breeze更新Home及其所有导航属性? 理想情况下,我希望在不清除缓存的情况下执行此操作,如here所述,以避免在我的UI上出现一些闪烁。

更新我

我尝试通过

扩展我的查询以包含Rooms
var query = entityQuery.from('Homes')
                       .withParameters({ homeId: homeId })
                       .expand("Rooms");

仍然是同一个问题,json数据包含其他客户端所做的更改但未反映在本地实体上

更新II

我设法使用expand将更改传播到客户端。但是,只有在添加Rooms时才会传播更改,但在删除时不会传播。

1 个答案:

答案 0 :(得分:2)

为了澄清一下,我的猜测是你正在处理一个客户在一个“房子”中添加和删除的“房间”,并且这些更新没有在具有相同“房屋”的另一个客户端上正确刷新。

如果是这种情况,原因是breeze客户端能够确定哪个“房间”已被另一个客户添加到房屋中,但它无法确定哪些房间已移动或移除,除非您也重新询问房间。

为了澄清,想象一下客房A是否将房间1从房屋1移动到房屋2.客户B仍然有房屋1包含房间1.当客户B重新询问房屋1(带有包括)时,它将不返回房间,但是微风不会从House 1中删除Room1,因为它不知道它移动到哪里。如果您要重新询问Room1或House 2,其中包含“Rooms”,那么微风将有足够的信息来“移动”房间。

因此,您可以遵循的一种方法是在“刷新”房屋之前简单地分离“所有”与特定房屋相关的房间。你会“失去”任何被搬到另一所房子的房子,但这些房屋可能会被更新的房子所取代。

不确定这是多么清楚,但是......