我有一个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
时才会传播更改,但在删除时不会传播。
答案 0 :(得分:2)
为了澄清一下,我的猜测是你正在处理一个客户在一个“房子”中添加和删除的“房间”,并且这些更新没有在具有相同“房屋”的另一个客户端上正确刷新。
如果是这种情况,原因是breeze客户端能够确定哪个“房间”已被另一个客户添加到房屋中,但它无法确定哪些房间已移动或移除,除非您也重新询问房间。
为了澄清,想象一下客房A是否将房间1从房屋1移动到房屋2.客户B仍然有房屋1包含房间1.当客户B重新询问房屋1(带有包括)时,它将不返回房间,但是微风不会从House 1中删除Room1,因为它不知道它移动到哪里。如果您要重新询问Room1或House 2,其中包含“Rooms”,那么微风将有足够的信息来“移动”房间。
因此,您可以遵循的一种方法是在“刷新”房屋之前简单地分离“所有”与特定房屋相关的房间。你会“失去”任何被搬到另一所房子的房子,但这些房屋可能会被更新的房子所取代。
不确定这是多么清楚,但是......