2012-09-10 103 views
0

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

所有的关联方法是围绕高速缓存,这使可用于进一步操作的最近查询的结果建立。缓存甚至可以在不同的方法间共享......

但是如果你想重新加载缓存呢,因为数据可能已经被应用程序的其他部分改变了?只是通过真该协会电话:

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 

回答

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(); 

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