如何清除Linq to Sql上的DataContext缓存

我正在使用Linq to Sql查询某个数据库,我只使用Linq从数据库中读取数据,并通过其他方式对其进行更改。 (这不能改变,这是我们正在扩展的应用程序的限制,所有更新必须通过其sdk)。

这很好,但是我遇到了一些缓存问题,基本上,我使用Linq查询一行,然后我通过外部方式删除它,然后我在外部创建一个新行如果我再次使用linq查询该行我得到了旧的(缓存)数据。

我无法关闭对象跟踪,因为这似乎阻止数据上下文自动加载相关属性(外键)。

有没有办法清除DataContex缓存?

我找到了一种方法,但它似乎并不安全: http ://blog.robustsoftware.co.uk/2008/11/clearing-cache-of-linq-to-sql.html

你怎么看? 我有什么选择?

如果要刷新特定对象,则Refresh()方法可能是您最好的选择。

像这样:

Context.Refresh(RefreshMode.OverwriteCurrentValues, objectToRefresh); 

如果需要一次刷新多个对象,还可以传递一个对象数组或一个IEnumerable作为第二个参数。

更新

我在评论中看到你在说什么,在reflection器里你看到里面发生了这种情况.Refresh():

 object objectByKey = context.Services.GetObjectByKey(trackedObject.Type, keyValues); if (objectByKey == null) { throw Error.RefreshOfDeletedObject(); } 

您链接的方法似乎是您的最佳选择,DataContext类不提供任何其他方法来清除已删除的行。 处理检查等等都在ClearCache()方法内…它实际上只是检查处理并在下面的CommonDataServices上调用ResetServices() CommonDataServices唯一的不良影响是清除你有的任何挂起的插入,更新或删除排队。

还有一个选项,你能为你正在做的任何操作启动另一个DataContext吗? 它不会有任何缓存……但这确实涉及一些计算成本,因此如果挂起的插入,更新和删除不是问题,我会坚持使用ClearCache()方法。

我使这个代码真正清除了“缓存”实体,将其分离。

 var entidades = Ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged); foreach (var objectStateEntry in entidades) Ctx.Detach(objectStateEntry.Entity); 

Ctx是我的上下文。

您应该能够重新查询使用此对象的结果集。 这不会拉缓存集,但实际上会返回最终结果。 我知道这可能不那么简单或可行,具体取决于您如何设置应用程序…

HTH。