Linq to sql LINQ到SQL数据上下文缓存

Linq to sql LINQ到SQL数据上下文缓存,linq-to-sql,Linq To Sql,我使用LINQtoSQL作为DAL层,在单元测试期间,我发现我的对象不是从数据库返回的,而是从DataContext缓存返回的 奇怪的是,当对象从缓存返回时,为什么需要单独调用数据库来获取所有字段 无论如何,我实现了一个ClearCache方法来清除缓存。但我只是在单元测试中清除缓存,而不是在API代码中 原因是,一旦插入对象,最好从缓存中加载,然后再次从数据库中获取它 你觉得怎么样 更新: public static void ClearCache(this EStudyModelDataCo

我使用LINQtoSQL作为DAL层,在单元测试期间,我发现我的对象不是从数据库返回的,而是从DataContext缓存返回的

奇怪的是,当对象从缓存返回时,为什么需要单独调用数据库来获取所有字段

无论如何,我实现了一个ClearCache方法来清除缓存。但我只是在单元测试中清除缓存,而不是在API代码中

原因是,一旦插入对象,最好从缓存中加载,然后再次从数据库中获取它

你觉得怎么样

更新

public static void ClearCache(this EStudyModelDataContext context)
        {
            const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            var method = context.GetType().GetMethod("ClearCache", Flags);
            method.Invoke(context, null);
        }

L2S将在可能的情况下从缓存返回项目,这是正确的。我通过艰苦的方式了解到了这一点。处理此问题的干净方法是在每次插入和更新操作后执行context.RefreshRow。这将刷新缓存并保证缓存是最新的。

在我的示例中,仅使用4个绑定:

DATACONTEXT.GetType().InvokeMember(
    "ClearCache",
    BindingFlags.Instance |
    BindingFlags.Public |
    BindingFlags.NonPublic |
    BindingFlags.InvokeMethod,
    null, DATACONTEXT, null);

手动调用“ClearCache”有一个很大的警告——那就是您正是这么做的!所以-如果您之前有任何数据库操作(挂起),您只需刷新它们。您必须非常小心,不要进行其他“提交时”更改。我通过艰苦的方式了解到这一点——因此我不得不在代码中添加更多的“SubmitChanges”语句——这是在一些存储过程执行(批量删除)后实现ClearCache的直接结果。

您正在使用DataContext实例吗?是的,我正在使用DataContext实例!更新帖子!我有一个ClearCache方法。我认为L2S缓存不会缓存整个对象,而只缓存对象的标识。这就是它从数据库中获取对象的原因。我可能错了!另外,我想我只想在单元测试中这样做,而不是在实际代码中这样做。我是通过使用存储库模式和接口来实现的。根据我的经验,L2S不会从数据库中检索整个对象,而是从缓存中获取它。我通过context.Log方法查看输出来验证这一点。当对象存在于缓存中时,没有对DB进行SQL调用。这很奇怪,因为我可以看到使用SQL profiler从L2S为select语句触发的查询。我先插入对象,然后使用Id检索它。我感到困惑。DataContext没有RefreshRow。