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

时间:2010-01-20 00:01:23

标签: c# linq-to-sql caching

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

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

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

有没有办法清除DataContex缓存?

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

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

3 个答案:

答案 0 :(得分:20)

如果您想刷新特定对象,那么Refresh() method可能是您最好的选择。

像这样:

Context.Refresh(RefreshMode.OverwriteCurrentValues, objectToRefresh);

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

更新

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

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

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

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

答案 1 :(得分:1)

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

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

Ctx是我的背景。

答案 2 :(得分:0)

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

HTH。