这是我做的一个小实验:
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查询窗口,并将值手动更改为“updated”。然后我继续运行。 Linq不会重新加载我的对象,而是重新使用它先前在内存中拥有的对象!这是数据并发的巨大问题!
如何禁用Linq显然保留在内存中的对象的隐藏缓存?
编辑-考虑一下,微软根本不可能在Linq框架中留下如此巨大的鸿沟。上面的代码是我正在做的事情的精简版,可能我错过了一些微妙之处。简而言之,如果您能做自己的实验来验证上述发现是否正确,我将不胜感激。或者,必须存在某种“ secret 开关”,使Linq对并发数据更新具有鲁棒性。但是呢
最佳答案
这不是我以前遇到的问题(因为我不倾向于长时间保持DataContexts的打开状态),但是看起来其他人有:
http://www.rocksthoughts.com/blog/archive/2008/01/14/linq-to-sql-caching-gotcha.aspx