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

alb*_*ein 13 c# caching linq-to-sql

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

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

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

有没有办法清除DataContex缓存?

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

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

Nic*_*ver 21

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

像这样:

Context.Refresh(RefreshMode.OverwriteCurrentValues, objectToRefresh);
Run Code Online (Sandbox Code Playgroud)

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

更新

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

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

您链接的方法似乎是您的最佳选择,DataContext类不提供任何其他方法来清除已删除的行.处置检查,如内部ClearCache()方法......这真的只是检查处理,并呼吁ResetServices()CommonDataServicesunderneath..the只有不良效果将清除任何未决的插入,更新或删除您已经排队.

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