0

在实体框架(任何版本)中清除数据库查询缓存是否有与此 Rails 辉煌的等价物?我一直有这个问题,似乎无法找到一个简单的方法来解决它:

所有的关联方法都是围绕缓存构建的,它使最新查询的结果可用于进一步的操作。缓存甚至可以跨方法共享....

但是,如果您想重新加载缓存,因为数据可能已被应用程序的其他部分更改,该怎么办?只需将 true 传递给关联调用:

customer.orders                 # retrieves orders from the database
customer.orders.size            # uses the cached copy of orders
customer.orders(true).empty?    # discards the cached copy of orders
                                # and goes back to the database
4

1 回答 1

1

这是可能的,但这些方法不能直接在实体上使用。您必须与上下文交互才能实现这一点。

如果您只需要重新加载单个实例,您可以使用:

dbContext.Entry(order).Reload();

如果您需要通过单个调用重新加载多个实例,您可能需要使用 ObjectContext API:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.Refresh(RefreshMode.StoreWins, customer.Orders);

另一种方法是运行查询而不是使用Refresh,但这需要您显式构建查询以加载正确的订单:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objectSet = objectContext.CreateObjectSet<Order>();
objectSet.MergeOption = MergeOption.OverwriteChanges;
objectSet.Where(o => o.CustomerId == customer.Id).ToList();

query 和 will 之间的主要区别在于Refresh性能(Refresh可能会对集合中的每个订单使用单独的查询)和新实体(刷新仅重新加载您指定的实体,而查询也将加载新实体)。

于 2012-09-10T08:13:14.137 回答