Linq中的ChangeConflictException转换为Sql非并发更新

时间:2009-06-19 19:02:12

标签: c# linq-to-sql conflict

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

我正在使用的一小部分代码是:

t = this.AppManager.ForumManager.GetThread(id);
t.Views = t.Views + 1;
this.AppManager.DB.SubmitChanges();

现在在我的测试中,我多次运行,非同时运行。执行此测试的对象总共有4个副本。

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

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

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

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

编辑:找到答案:

您可以在表格的所有列上设置“UpdateCheck = Never”以创建最后一次胜利的更新样式。这是应用程序在将其移植到LINQ之前使用的内容,因此我现在将使用它。

EDIT2:虽然我上面的修复确实可以防止抛出异常,但它没有解决根本问题:

由于我有多个数据上下文,因此最终会有多个每个对象的缓存副本。我是否应该在每次加载页面时重新创建数据上下文?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

为了回应你关于让上下文忘记一切的最后评论,我认为没有办法做到这一点,但我怀疑这是因为所有上下文都是被跟踪的更改(和连接),以及你也可以创建一个新的上下文(记得处理旧的上下文),因为你真的要扔掉上下文的所有内容。