调用 DataContext.SubmitChanges() 时发生 StackOverflow 错误

StackOverflow error when calling DataContext.SubmitChanges()

在混合 asp.net 网络应用程序中,框架 4.5.1,使用 LINQ 到 SQL(不是 Entity Framework)我得到异常

"An unhandled exception of type 'System.WhosebugException' occurred in System.Data.Linq.dll"

DataContext.SubmitChanges().

的任何调用

每次调用 SubmitChanges() 都会导致错误,具体更改的实体无关紧要。错误会立即抛出(与大多数 Whosebug 异常不同,后者通常需要几秒钟才能在 er运行t 代码溢出堆栈时发生)。

asp.net Web 应用程序 运行 在我的 IIS Express 本地主机上使用 Visual Studio 2013。数据库是 SQL Server 2005。

我的问题是,如何在这种环境中调试 Whosebug 异常?现在上面的错误消息是我得到的。

  1. The Event Viewer notes that the browser crashed (it happens in both IE 11 and Chrome) but nothing about the LINQ to SQL exception.
  2. The SQL Server process monitor does not register any database call.
  3. I have a log hooked up to my DataContext but it records nothing.

似乎堆栈溢出发生在 System.Data.dll 内部,发生在任何数据库调用发生之前和任何内容被记录之前。

这在几个小时前突然开始发生,在 windows 更新 运行 并且机器重新启动之后。这可能是巧合。

还有一件非常奇怪的事情:我们店里有四个开发人员,都使用 Visual Studio 2013。我们两个人突然开始遇到这个问题,而且我们两个人从来没有遇到过。我们都是 运行 相同的代码并访问相同的数据库。我们两个人都重启了,一台机器上问题消失了,我的机器上还是这样。

除了重新启动之外,我还从机器上删除了该项目并将其从源代码管理中拉下来,以便它与我的 3 个同事拥有的相同,删除了我机器上的所有临时 Internet 文件,并删除了我所有的 AppData\Local\temp 文件用于我的登录。

有什么办法可以调试这个问题吗?

发生异常时调用堆栈的剪辑(对VisitExpression等的调用重复数十次直到结束)。

本例中不令人满意的 "answer" 是删除 *.dbml 文件并重新创建它。这修复了堆栈溢出错误。

我上面回复@GertArnold 的评论不准确。只有一个 DataContext 抛出堆栈溢出异常。它正在为 DataContext 中的每个实体执行此操作,但应用程序中的其他 DataContext 工作正常。

这个特殊的 *.dbml 文件多年来一直在增长,变得非常庞大。在重新创建时,我小心翼翼地只添加了被引用的数据库对象,这导致了一个更小的 *.dbml 文件,它本身可能已经解决了问题。

非常感谢汤姆提供的信息!

为了防止其他人遇到同样的问题,这里是我案例的额外信息。我的电脑昨天得到了一批Windows更新后,我遇到了一个非常相似的问题,这些更新包括windows10、OS、VS2013/VS2015等。我主要使用VS2013,一些与汤姆的情况不同的是,

  1. 仅在更新一个实体时弹出,同一 DataContext 中的其他实体可以正常工作
  2. 只影响我的 ASP.NET Web API 项目,控制台应用程序很好,甚至所有应用程序项目都引用同一个 unitofwork 数据层项目(在 dbml 文件所在的位置)
  3. 替换 dbml 文件对我不起作用,我最终通过在 VS2015 中打开解决方案 >> 调试 >> 关闭 VS2015 >> 在 VS2013 中打开解决方案解决了问题,问题就消失了