调用DataContext.SubmitChanges()时出现堆栈溢出错误。

3
在一个混合的asp.net网页应用程序中,使用框架4.5.1和LINQ to SQL(而不是Entity Framework),我遇到了异常。每次调用DataContext.SubmitChanges()都会导致错误,无论修改哪个具体实体都会出现这个错误。这个错误立即抛出(与大多数StackOverflow异常不同,通常需要几秒钟来发生,因为错误代码溢出了堆栈)。asp.net网页应用程序在本地主机上运行,在使用Visual Studio 2013时使用IIS express。数据库是SQL Server 2005。我的问题是,在这种环境下如何调试StackOverflow异常?现在以上错误消息是我得到的全部内容。事件查看器注意到浏览器崩溃了(它在IE 11和Chrome中都发生),但没有关于LINQ to SQL异常的任何信息。SQL Server进程监视器没有注册任何数据库调用。我已经连接了一个日志到我的DataContext,但它没有记录任何东西。

在任何数据库调用发生之前,也在任何日志记录之前,栈溢出似乎发生在System.Data.dll内部。

几个小时前突然开始出现这种情况,可能是Windows更新后机器重新启动造成的巧合。

还有一些非常奇怪的事情:我们店里有四名开发人员,都使用Visual Studio 2013。其中两个人突然遇到了这个问题,而另外两个人从来没有遇到过。我们都运行相同的代码并访问同一个数据库。那两个遇到问题的人已经重新启动了机器,其中一个机器上的问题消失了,但我的机器上仍然存在。

除了重新启动,我还从机器上删除了该项目,并从源控制中获取了与我的三个同事完全相同的代码,删除了我的机器上的所有临时Internet文件,并删除了我的登录的所有AppData\Local\temp文件。

有没有办法调试这个问题?

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

enter image description here


如果您在 Linqpad 中连接到数据库(Linqpad 在内部使用 LINQ to SQL),会发生什么? - Gert Arnold
你能够附加调试器并查看调用堆栈窗口以便排查SO问题吗? - usr
@usr:是的,我在Visual Studio中运行它,所以不需要附加调试器,我添加了异常发生时的调用堆栈图片。 - Tom Regan
@usr,请问“L2S bug”是什么意思? - Tom Regan
@usr,dbml是一团糟的遗留问题,太多了,无法在此处全部列出。但我认为答案不在dbml中。每次调用DataContext.SubmitChanges()都会失败,无论更新哪个实体。此外,我的三个同事可以使用相同的代码在他们的机器上保存相同的实体。这是突然在我的机器上发生的事情。 - Tom Regan
显示剩余5条评论
2个回答

0
在这种情况下,不令人满意的“答案”是删除 *.dbml 文件并重新创建它。这解决了堆栈溢出错误。
我对 @GertArnold 的回复评论不准确。只有一个 DataContext 抛出了堆栈溢出异常。它为 DataContext 中的每个实体执行此操作,但应用程序中的其他 DataContext 正常工作。
这个特定的 *.dbml 文件随着时间的推移变得越来越大。重新创建时,我小心地只添加正在引用的数据库对象,这导致了一个更小的 *.dbml 文件,这本身可能已经解决了问题。

0

非常感谢Tom提供的信息!

以防其他人遇到同样的问题,这是我个人案例中的额外信息。昨天我的电脑进行了一批Windows更新,其中包括Windows10操作系统、VS2013/VS2015等更新。我主要使用VS2013,与Tom的情况有一些不同:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接