【发布时间】:2014-11-25 19:38:40
【问题描述】:
我正在为 SQL Server 使用 ServiceStack.Ormlite,并且刚刚从 3.9.71 更新到 4.0.33.0,现在直接命令的事务失败。我可以让 ORMlite 事务正常工作或直接命令,但不能两者兼而有之。
复杂之处在于我正在执行一些非常复杂的 DB 命令,并且由于用于大量 GUID 的 Sql.In() 非常慢,所以我有一个解决方法,它使用 db.CreateCommand() 然后将 GUID 列表作为自定义表格类型。
因此,我需要一个事务来跨越 ORMLite 命令和直接 db 命令。以下代码以前可以工作,现在失败了。
例如,以下代码曾经可以工作。我现在收到错误说 CreateCommand() 应该使用事务。当我直接尝试时,我会得到指示的cast exception:
using (var db = DB.Connection.OpenDbConnection())
{
using (var transaction = db.OpenTransaction())
{
// Some ORMLite code
db.Delete<SomeType>();
using (var command = db.CreateCommand())
{
// Direct DB command
command.CommandText = "Delete from SomeTable where ...";
command.Parameters.Add(GUIDList)
command.ExecuteNonQuery();
}
}
}
说明: 在代码中 OpenTransaction() 将适用于 OrmLite 代码,但在 CreateCommand 代码上失败。 OrmLite 代码的 BeginTransaction() 将失败。
实际错误在 command.ExecuteNonQuery():当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery 要求命令具有事务。该命令的 Transaction 属性尚未初始化。
【问题讨论】:
标签: sql-server transactions ormlite-servicestack