我面临的问题可能很常见,但我找不到任何解决方案.当用户在其客户端上的缓存中有实体而另一个用户删除其中一些实体(在服务器上)时,会发生此问题.当第一个用户想要更新其数据时,不会从缓存中删除已删除的实体.您可以通过每次更新时清除缓存来解决此问题,但之后您也会丢失所有未保存的更改.我错过了一些明显的东西吗
例:
模型:
public class Order
{
[Key]
public int Id { get; set; }
public ICollection<OrderDetail> OrderDetails { get; set; }
}
public class OrderDetail
{
[Key]
public int Id { get; set; }
[ForeignKey("Order")]
public int Order_Id { get; set; }
public virtual Order Order { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
客户代码:
function getOrder(orderId, orderObservable) {
var query = EntityQuery.from("Orders")
.where("orderId", "==", orderId)
.expand("orderDetails");
return manager.executeQuery(query).then(querySucceeded).fail(queryFailed);
function querySucceeded(data) {
var order = data.results[0];
// NOTE: the removed orderdetail is still there 'order.orderDetails'
orderObservable(order);
}
}
Run Code Online (Sandbox Code Playgroud)
分步方案:
在breeze-docs中,在标题"关于缓存清除的重要注意事项"下,有一种解决方案可以通过比较缓存和查询结果来删除缓存实体,并分离结果中缺少的实体. http://www.breezejs.com/documentation/entitymanager-and-caching 但在这种情况下这不起作用.我猜它与orderdetails与订单有关并且在传递给success-callback之前从缓存中"拾取"这一事实有关.
所有帮助表示赞赏!
您面临的问题不是 Breeze 的问题,而是总体设计的问题。我想到了几个选项 -
使用 SignalR 通知您的 Web 应用程序发生了更改,从缓存中分离任何已删除的实体。
使用已存档或已删除标志,而不是从数据库中删除实体。
两者都有各自的优点和缺点。
使用 SignalR,您需要为通知做好准备,并围绕删除已删除的实体设置特定的工作流程
manager.detachEntity(entityToDetach);
Run Code Online (Sandbox Code Playgroud)
您之所以要分离而不是删除,是因为如果您将其设置为删除,那么您的 Breeze 实体管理器仍然认为您需要将该更改保留到数据库中。
如果您使用标志,那么您可以简单地将业务逻辑设置为忽略标记为已删除或已存档的实体,并且当您查询数据库时,它将返回该实体的更改并停止显示它
myEntity().archived(true);
Run Code Online (Sandbox Code Playgroud)
这里的问题是,如果您的实体与您的查询不匹配,它永远不会返回更新的实体以让客户端知道它已存档或删除。另一个警告是,您的数据库中可能存在不再活动的信息。
根据您的应用程序类型和要求,您应该做出其中一种选择,或者提出另一种选择。希望有帮助。
| 归档时间: |
|
| 查看次数: |
1553 次 |
| 最近记录: |