C# Linq DataContext提交更改来自ZombieCheck的InvalidOperationException

C# Linq DataContext提交更改来自ZombieCheck的InvalidOperationException,c#,linq,sql-server-2008,datacontext,C#,Linq,Sql Server 2008,Datacontext,尝试使用LinqToSql添加行时,我收到一个invalidoOperationException。我们不能在内部复制它,而且只有一个客户的复制率为0.06%,始终只需对数据库进行相对简单的更改。(单行插入或单字段更新) 下面是一段示例代码(数据库自动生成主键) 我们使用SQLServer2008R2。插入和更新在服务器上进行。但我们还是有例外。没有任何东西可以阻止这些更新和插入的发生。没有依赖关系或其他东西 我们如何阻止这些异常/僵尸检查/回滚的发生,或者首先是什么导致了它们 编辑: 经过进一

尝试使用LinqToSql添加行时,我收到一个
invalidoOperationException
。我们不能在内部复制它,而且只有一个客户的复制率为0.06%,始终只需对数据库进行相对简单的更改。(单行插入或单字段更新)

下面是一段示例代码(数据库自动生成主键)

我们使用SQLServer2008R2。插入和更新在服务器上进行。但我们还是有例外。没有任何东西可以阻止这些更新和插入的发生。没有依赖关系或其他东西

我们如何阻止这些异常/僵尸检查/回滚的发生,或者首先是什么导致了它们

编辑:


经过进一步检查,SubmitChanges()正在进行的数据库更新实际上正在进行。事务成功完成后,将调用此异常,并且数据库行将更新为新值。

需要注意的一点是,LinqToSql(和EntityFramework)默认情况下将为数据对象中的
DateTime
字段分配
null
,因此,如果您的表有一个
datetime
字段,那么如果datacontext试图插入该空值,它将在insert时引发异常

您可以通过在MSSQL中使用
DateTime 2
类型(这将允许
DateTime
对象的“null”值-
01/01/0001
)或在插入/更新之前手动为数据对象的
DateTime
字段指定有效日期来避免此错误

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

编辑:

看起来这并不是很少见:


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

不,所有字段都已填写。这种情况的发生率为0.06%。简单更新相当于更新表集合field1='text',其中primaryKey=123。堆栈跟踪的唯一其他部分是调用DataContext SubmitChanges()函数的my user函数。这是否只发生在特定的代码块上,如果是,它是否在任何时候都在使用块的
中?我们所有的数据库更新函数都调用一个公共函数来执行DataContext SubmitChanges()。因此,失败的代码总是同一行。
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();