C# Linq到Sql非并发更新中的ChangeConflictException

C# Linq到Sql非并发更新中的ChangeConflictException,c#,linq-to-sql,conflict,C#,Linq To Sql,Conflict,我正在使用LINQtoSQL,并且在增加视图计数器交叉连接时遇到了一些问题 我正在使用的一点点代码是: t = this.AppManager.ForumManager.GetThread(id); t.Views = t.Views + 1; this.AppManager.DB.SubmitChanges(); 现在在我的测试中,我多次运行这个,非并发。执行此测试的对象共有4个副本 也就是说,没有锁定问题,或者类似的问题,但是有4个数据上下文 现在,我希望这样做:获取一行,修改一个字段,更

我正在使用LINQtoSQL,并且在增加视图计数器交叉连接时遇到了一些问题

我正在使用的一点点代码是:

t = this.AppManager.ForumManager.GetThread(id);
t.Views = t.Views + 1;
this.AppManager.DB.SubmitChanges();
现在在我的测试中,我多次运行这个,非并发。执行此测试的对象共有4个副本

也就是说,没有锁定问题,或者类似的问题,但是有4个数据上下文

现在,我希望这样做:获取一行,修改一个字段,更新该行。但是,这会引发ChangeConflictException

如果没有一个副本同时运行,为什么更改会发生冲突

有没有办法忽略某个表上的更改冲突

编辑:找到了答案:

您可以在表的所有列上设置“UpdateCheck=Never”,以创建wins中的最后更新样式。这是我将应用程序移植到LINQ之前所使用的,所以这就是我现在要使用的

EDIT2:虽然我上面的修复确实阻止了抛出异常,但它没有修复根本问题:

因为我有多个数据上下文,所以每个对象都有多个缓存副本。我是否应该在每次加载页面时重新创建数据上下文


我宁愿指示数据上下文忘记一切。这可能吗?

我认为DataContext的缩进是相对轻量级和短期的。在IMO中,您不应该缓存加载了DataContext的数据超过必要的时间。当它的寿命很短时,它仍然相对较小,因为(据我所知)DataContext的内存使用主要与跟踪您对它所管理(由它检索)的对象所做的更改相关

在我处理的应用程序中,我们创建上下文,在UI上显示数据,等待用户更新,然后更新数据。但是,这是必要的,主要是因为我们希望更新基于用户正在查看的内容(否则,当用户点击更新时,我们可以检索数据并立即更新)。如果您的更新是相对独立的,我认为在更新之前立即检索行是明智的

您还可以使用System.Data.Linq.DataContext.Refresh()将已检索到的数据与数据库中的数据重新同步,以帮助解决此问题

为了回应您上一次关于让上下文忘记一切的评论,我认为没有办法做到这一点,但我怀疑这是因为上下文的所有内容都是跟踪的更改(和连接),您最好创建一个新的上下文(记住处理旧的上下文)因为你真的想扔掉一切背景