尝试使用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()正在进行的数据库更新实际发生。在事务成功完成后调用此异常,并将数据库行更新为新值。
答案 0 :(得分:0)
要注意的一件事是LinqToSql(和EntityFramework)默认情况下会将null
分配给数据对象中的DateTime
字段,因此如果您的表中有datetime
字段,如果datacontext尝试插入该空值,将在插入时抛出异常。
您可以通过在MSSQL中使用datetime2
类型(允许DateTime
对象的“null”值 - 01/01/0001
)或手动分配有效来解决此错误在插入/更新之前,数据对象的DateTime
字段的日期。
如果没有更详细的堆栈跟踪,这是我想到的唯一明显的问题。 HTH。
修改强>
根问题似乎是LinqToSql使用的内部ADO逻辑没有真正正确配置以处理事务回滚。据我所知,唯一真正的解决方案是为LinqToSql提供一个事务对象并自己管理回滚,这看起来并不那么吸引人。