Linq To Sql - 没有抛出ChangeConflictException。为什么?

时间:2009-03-18 18:12:59

标签: c# .net database linq linq-to-sql

我试图通过改变两个不同浏览器中的记录来强制ChangeConflictException。这在过去对我有用。但现在它不会抛出异常。

最后一个赢了。

我已检查了我正在更新的实体的列属性,并且每列都设置为始终检查。

我能找到什么吗?

我没有扩展此数据上下文或对任何属性进行任何修改。

感谢。

编辑

这是一个ASP.net应用程序。

2 个答案:

答案 0 :(得分:2)

你确定这不是发生的事情:

  1. 浏览器A加载实体X
  2. 浏览器B加载实体X
  3. 浏览器A提交表单
  4. 浏览器A再次加载实体X,更改属性并再次存储
  5. 浏览器B提交表单
  6. 浏览器B再次加载实体X,更改属性并再次存储
  7. 这里的关键点是实体在回发时重新加载(HTTP =无状态),并且在6)你实际上正在加载4)所做的更改并覆盖它们。 Linq2Sql不会“盖章”您需要手动执行此操作的表单。

    您在评论中写道,您有另一个有用的应用程序。如果这是一个Windows应用程序,那么情况就完全不同了,因为实体很可能不会再次重新加载。

答案 1 :(得分:0)

那是一场竞争条件。考虑您可能正在检索信息,更新并发送到数据库。如果第一个提交对db的更改,则在第二个检索信息之前,您不会发生冲突。

更新:关于无法执行此操作的评论。你可以这样做,你使用Attach方法,但你需要保留你想要它检查并发性的任何原始值。检查这些:

linq2sql-update-object-not-created-in-datacontext

how-to-update-a-single-column-in-linq-without-loading-the-entire-row

这肯定是linq数据源下发生的事情。