【问题标题】:How to clear the DataContext cache on Linq to Sql如何清除 Linq to Sql 上的 DataContext 缓存
【发布时间】:2011-01-07 01:48:57
【问题描述】:

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

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

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

有什么方法可以清除 DataContex 缓存吗?

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

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

【问题讨论】:

  • 重新创建一个新的 DataContext 怎么样?

标签: c# linq-to-sql caching


【解决方案1】:

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

像这样:

Context.Refresh(RefreshMode.OverwriteCurrentValues, objectToRefresh);

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

更新

我在 cmets 中看到了你在说什么,在反射器中你看到在 .Refresh() 内部发生了这种情况:

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

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

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

【讨论】:

  • 问题是我正在删除对象,所以,如果我尝试刷新它,我会收到一个异常,告诉我实体不再存在。
  • @AlbertEin:我明白你的意思,在这里启动了一个测试项目......更新了答案,希望能缓解你发现的方法的一些安全问题。
  • 我对挂起的更改没有任何问题,因为我更改了 Linq 之外的所有内容,我会检查一下。谢谢
  • 我有一个带有“Cascade Null”外键的对象。从外部表中删除行后,我必须使用 OverwriteCurrentValues 刷新对象。否则,外键仍然有一个值,并且没有像在数据库中那样设置为 null。
【解决方案2】:

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

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

Ctx 是我的上下文。

【讨论】:

  • 不是真正的答案,因为这是实体框架,而不是 LINQ to SQL。
【解决方案3】:

您应该能够重新查询正在使用此对象的结果集。这不会提取缓存集,但实际上会返回最终结果。我知道这可能并不容易或不可行,具体取决于您设置应用的方式...

HTH。

【讨论】:

  • 我正在做另一个查询,我正在访问缓存。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2012-12-25
相关资源
最近更新 更多