2009-06-19 57 views
0

我正在使用LINQ to SQL,并且有一个问题增加了视图计数器交叉连接。Linq中的ChangeConflictException到Sql非并发更新

的我使用代码蝇头位是:

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

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

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

现在,我希望这样工作:取一行,修改一个字段,更新行。但是,这是抛出一个ChangeConflictException。

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

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

编辑:找到了答案:

您可以设置“UpdateCheck的=从不”上表中的所有列创建更新的后入胜的风格。这是应用程序在将它移植到LINQ之前所使用的,因此我现在将使用它。

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

因为我有一个以上的数据背景下,最终被一个以上的缓存每个对象的副本。我应该在每次加载页面时重新创建数据上下文吗?

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

回答

2

我相信DataContext被缩进为相对轻量级和短暂的。国际海事组织,你不应该缓存用DataContext加载的数据超过必要的时间。当它短暂时,它仍然相对较小,因为(据我了解),DataContext的内存使用率主要与跟踪由它管理的对象(由其检索)所做的​​更改有关。

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

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

为了回应你最近关于使上下文忘记一切的评论,我不认为有办法做到这一点,但我怀疑这是因为所有上下文都是跟踪的更改(和连接),而且你创建一个新的上下文(记得处理旧的上下文)就好了,因为你真的想丢掉上下文所有的东西。