【发布时间】:2009-09-30 15:51:25
【问题描述】:
这是我做的一个小实验:
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 对并发数据更新具有鲁棒性。但是什么?
【问题讨论】:
标签: c# linq linq-to-sql concurrency