代码之家  ›  专栏  ›  技术社区  ›  albertein

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

  •  13
  • albertein  · 技术社区  · 16 年前

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

    有没有办法清除DataContex缓存?

    http://blog.robustsoftware.co.uk/2008/11/clearing-cache-of-linq-to-sql.html

    你怎么认为?我有什么选择?。

    3 回复  |  直到 16 年前
        1
  •  21
  •   Nick Craver    16 年前

    如果要刷新特定对象,则 Refresh() method 也许是你最好的选择。

    Context.Refresh(RefreshMode.OverwriteCurrentValues, objectToRefresh);
    

    我在评论中看到了您正在谈论的内容,在reflector中您看到了内部发生的情况。Refresh():

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

    您链接的方法似乎是您的最佳选择,DataContext类不提供任何其他方法来清除已删除的行。处置检查等都在 ClearCache() ResetServices() CommonDataServices 下面..唯一的不良影响是清除您已排队的任何挂起的插入、更新或删除。

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

        2
  •  1
  •   Tiago Gouvêa    12 年前

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

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

    其中Ctx是我的上下文。

        3
  •  0
  •   Brian Mains    16 年前

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

    嗯。