这是我做的一个小实验:
MyClass obj = dataContext.GetTable<MyClass>().Where(x => x.ID = 1).Single(); Console.WriteLine(obj.MyProperty); // output = "initial" Console.WriteLine("Waiting..."); // put a breakpoint after this line obj = null; obj = dataContext.GetTable<MyClass>().Where(x => x.ID = 1).Single(); // same as before,but reloaded Console.WriteLine(obj.MyProperty); // output still = "initial" obj.MyOtherProperty = "foo"; dataContext.SubmitChanges(); // throws concurrency exception
当我在第3行之后点击断点时,我转到SQL查询窗口并手动将值更改为“已更新”.然后我继续跑步. Linq不重新加载我的对象,但重新使用它以前在内存中的对象!这是数据并发的一个巨大问题!
你如何禁用Linq显然保留在内存中的这些隐藏的对象缓存?
编辑 – 经过反思,微软本可以在Linq框架中留下如此巨大的鸿沟,这简直是不可想象的.上面的代码是我正在做的事情的一个愚蠢的版本,我可能错过了一些细微之处.简而言之,如果您进行自己的实验来验证我的上述发现是否正确,我将不胜感激.或者,必须有某种“秘密开关”使Linq对并发数据更新具有强大的功能.但是什么?
解决方法
这不是我以前遇到的问题(因为我不倾向于长时间保持DataContexts打开),但看起来像其他人有:
http://www.rocksthoughts.com/blog/archive/2008/01/14/linq-to-sql-caching-gotcha.aspx