Linq DataContext来自ZombieCheck的SubmitChanges InvalidOperationException

时间:2013-03-11 18:58:39

标签: c# linq sql-server-2008 datacontext

尝试使用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()正在进行的数据库更新实际发生。在事务成功完成后调用此异常,并将数据库行更新为新值。

1 个答案:

答案 0 :(得分:0)

要注意的一件事是LinqToSql(和EntityFramework)默认情况下会将null分配给数据对象中的DateTime字段,因此如果您的表中有datetime字段,如果datacontext尝试插入该空值,将在插入时抛出异常。

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

如果没有更详细的堆栈跟踪,这是我想到的唯一明显的问题。 HTH。

修改

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

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