【发布时间】:2014-12-29 18:10:48
【问题描述】:
我正在使用ServiceStack.Ormlite v3.9.71 并且在我打开 Ormlite SQLite 事务的地方有以下代码,假设我想在代码的其他地方的命令中使用此事务:
var connFactory = new OrmLiteConnectionFactory("ConnectionString", SqliteOrmLiteDialectProvider.Instance)
using (IDbConnection db = connFactory.Open()) // using var doesn't make a difference
using (IDbTransaction tran = db.OpenTransaction()) // using var or even db.BeginTransaction() doesn't make a difference
{
// I do lots of boring stuff
...
// Somewhere else in the code
using (var cmd = db.CreateCommand())
{
cmd.Transaction = tran; // get an error
}
}
但是当我这样做时,我得到了:
A first chance exception of type 'System.InvalidCastException' occurred in System.Data.dll
Additional information: Unable to cast object of type 'ServiceStack.OrmLite.OrmLiteTransaction' to type 'System.Data.Common.DbTransaction'.
还有堆栈跟踪:
at System.Data.Common.DbCommand.System.Data.IDbCommand.set_Transaction(IDbTransaction value)
我猜这是由于 OrmLiteTransaction 包装器造成的,我怎样才能进行交易?
【问题讨论】:
-
db是什么类型,您使用的是哪个连接工厂? (即 OpenTransaction 不是普通 IDbConnection 接口的一部分) -
您使用的是哪个版本的 OrmLite?
tmpTran的类型是什么?它是在哪里创建的? -
@PanagiotisKanavos,已添加/更新,我上次的更新弄乱了代码
-
尝试使用
using(IDbConnection db = connFactory.Open())更改为using (var db = connFactory.Open())下一行相同。也许不使用该接口的CreateCommand版本会重新运行可以接受OrmLiteTransaction的命令 -
@Mangus 对此不确定。 OrmLiteTransaction 实现了 IDbTransaction,但
cmd.Transaction似乎期望DbCommand即使它的类型是 IDbTransaction。在内部,SS 使用Mono.Data.Sqlite。会不会是这个驱动使用了 DbTransaction?
标签: c# sqlite ormlite-servicestack