LINQ to SQL DataContext缓存

时间:2010-01-26 17:23:17

标签: linq-to-sql

我使用Linq to SQL作为我的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);
        }

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

你是正确的,L2S会尽可能从缓存中返回项目。我用艰难的方式了解了这一点。处理此问题的一种干净方法是在每次插入和更新操作后执行context.RefreshRow。这将刷新缓存并确保缓存是最新的。

答案 2 :(得分:1)

手动调用'ClearCache'有一个很大的警告 - 就是你正是这样做的!所以 - 如果你有任何先前的数据库操作(待定),你只需刷新它们。您必须非常小心,没有采取其他“提交”更改。我学到了很多东西 - 所以我不得不在我的代码中添加一些'SubmitChanges'语句 - 这是在一些存储过程执行(批量删除)后实现ClearCache的直接结果。