为什么我不能将 ServiceStack OrmLite 中的 IDbTransaction 转换为 DbTransaction?

MaY*_*YaN 0 c# sqlite ormlite-servicestack

我正在使用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
    }
}    
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我得到:

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'. 
Run Code Online (Sandbox Code Playgroud)

和堆栈跟踪:

   at System.Data.Common.DbCommand.System.Data.IDbCommand.set_Transaction(IDbTransaction value)
Run Code Online (Sandbox Code Playgroud)

我想这是由于 OrmLiteTransaction 包装器造成的,我如何才能进行交易?

小智 5

OrmLite 提供 ToDbTransaction 扩展方法。

public static IDbTransaction ToDbTransaction(this IDbTransaction dbTrans)
    {
        var hasDbTrans = dbTrans as IHasDbTransaction;
        return hasDbTrans != null
            ? hasDbTrans.Transaction
            : dbTrans;
    }
Run Code Online (Sandbox Code Playgroud)

您可以像这样在代码中使用它。

cmd.Transaction = tran.ToDbTransaction()
Run Code Online (Sandbox Code Playgroud)

希望它能解决你的问题。