0

我正在使用 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:虽然我上面的修复确实阻止了异常被抛出,但它并没有解决根本问题:

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

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

4

1 回答 1

2

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

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

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

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

于 2009-06-20T12:39:44.993 回答