我使用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);
}
答案 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的直接结果。