gpt4 book ai didi

caching - Breeze:从另一个用户从数据库中删除的缓存中删除实体而不清除整个缓存?

转载 作者:行者123 更新时间:2023-12-04 20:44:35 24 4
gpt4 key购买 nike

我面临一个可能很常见的问题,但我找不到任何解决方案。
当一个用户在客户端的缓存中有实体而另一个用户删除其中一些实体(在服务器上)时,就会出现问题。当第一个用户想要更新其数据时,移除的实体不会从缓存中移除。您可以通过每次更新时清除缓存来解决它,但是您也会丢失所有未保存的更改。
我错过了一些明显的东西吗?

例子:

模型:

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; }
}

客户端代码:
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);
}
}

分步场景:
  • 用户 A 查询具有相应订单详细信息的订单。
  • 然后将订单和订单详细信息放入缓存中。
  • 用户 B 删除订单详细信息并将更改保存到服务器。
  • 用户 A 查询以获取订单的最新更新。
  • 当查询返回删除的 orderdetail 时,它仍然存在。

  • 在 Breeze 文档中,在标题“关于缓存清除的重要注意事项”的标题下,有一个解决方案通过比较缓存和查询结果来移除缓存实体,并分离结果中缺失的实体。
    http://www.breezejs.com/documentation/entitymanager-and-caching
    但这在这种情况下不起作用。我猜这与 orderdetails 与订单相关并且在传递给成功回调之前从缓存中“提取”这一事实有关。

    感谢所有帮助!

    最佳答案

    您面临的问题不在于 Breeze,而在于总体设计。有几个选项浮现在脑海中——

  • 使用 SignalR 通知您的 Web 应用程序发生了更改,从缓存中分离任何已删除的实体。
  • 使用存档或删除标志而不是从数据库中删除实体。

  • 两者都有其优点和缺点。

    使用 SignalR,您需要为通知设置管道工作,并围绕删除已删除的实体设置特定的工作流程
    manager.detachEntity(entityToDetach);

    您将分离而不是删除的原因是,如果您将其设置为已删除,那么您的 Breeze 实体管理器仍然认为您需要将该更改保留到数据库中。

    如果您使用标志,那么您可以简单地将业务逻辑设置为忽略标记为已删除或已存档的实体,并且当您查询数据库时,它将返回对该实体的更改并停止显示它
    myEntity().archived(true);

    这里的问题是,如果您的实体与您的查询不匹配,它永远不会返回更新后的实体,让客户端知道它已被存档或删除。另一个警告是,您的数据库中将有不再处于事件状态的信息。

    根据您的应用程序类型和要求,您应该做出这些选择中的一个,或者提出另一个。希望有帮助。

    关于caching - Breeze:从另一个用户从数据库中删除的缓存中删除实体而不清除整个缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20163066/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com