Linq DataContext 提交更改时出现来自 ZombieCheck 的 InvalidOperationException

5

当使用LinqToSql添加行时,我会遇到InvalidOperationException错误。我们在内部无法重现此问题,但只有一个客户的发生率约为0.06%,并且仅发生在对数据库进行相对简单的更改时(单行插入或单个字段更新)。

Message:
   This SqlTransaction has completed; it is no longer usable.
Stack Trace:
   at System.Data.SqlClient.SqlTransaction.ZombieCheck()
   at System.Data.SqlClient.SqlTransaction.Rollback()
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)

这是一个示例代码(数据库自动生成主键):

TableName row = new TableName();
row.Description = "something";
row.Action = "action";
Context.TableName.InsertOnSubmit(row);
Context.SubmitChanges();

我们使用的是 SQL Server 2008 R2。在服务器上,插入和更新确实已经完成了。但我们仍然会收到异常信息。没有任何东西应该阻止这些更新和插入操作的进行。也没有依赖关系或其他东西。
我们如何停止这些异常、僵尸检查或回滚的发生,或者是什么导致它们首先发生的?
编辑:经过进一步检查,SubmitChanges() 所做的数据库更新实际上已经完成了。此异常在事务成功完成并且数据库行被更新到新值后被调用。

这是否仅发生在特定的代码块中,如果是,是否在任何时候都在 using 块内? - Tieson T.
我们所有的数据库更新函数都调用一个公共函数来执行DataContext SubmitChanges()。因此,总是同一行代码失败。 - David
1个回答

0

需要注意的一件事是,LinqToSql(和EntityFramework)默认会将null分配给数据对象中的DateTime字段,因此,如果您的表具有datetime字段,并且数据上下文尝试插入该空值,则会在插入时引发异常。

您可以通过在MSSQL中使用datetime2类型(它将允许DateTime对象的“null”值- 01/01/0001)或在插入/更新之前手动为数据对象的DateTime字段分配有效日期来解决此错误。

没有更详细的堆栈跟踪,这是我想到的唯一明显的问题。希望对你有所帮助。

编辑:

看起来这并不是完全不常见:http://connect.microsoft.com/VisualStudio/feedback/details/588676/system-data-linq-datacontext-submitchanges-causes-invalidoperationexception-during-rollback#details

根本问题似乎是LinqToSql使用的内部ADO逻辑没有正确配置以处理事务回滚。据我所知,唯一真正的解决方案是向LinqToSql提供一个事务对象并自己管理回滚,这似乎并不是很吸引人。


不,所有字段都已填写。这种情况发生的概率为0.06%。简单的更新相当于Update table set field1='text' where primaryKey=123。堆栈跟踪的唯一其他部分是调用DataContext SubmitChanges()函数的我的用户函数。 - David

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