如果完成,ORMLite下的SQLite不允许在事务之后执行任何操作

koj*_*ojo 5 c# sqlite servicestack ormlite-servicestack

在我通过ServiceStack的OrmLite在SQLite中创建和提交事务后,我无法继续发出任何查询.

例如,以下测试失败:

        [Test, Explicit]
        public void Can_query_after_transaction_is_committed()
        {
            var connection = new OrmLiteConnectionFactory(":memory:", false, SqliteDialect.Provider, true);
            using (var db = connection.OpenDbConnection())
            {
                db.DropAndCreateTable<SimpleObject>();
                var trans = db.OpenTransaction();
                db.Insert(new SimpleObject{test="test"});
                trans.Commit();
                Assert.DoesNotThrow(()=> db.Select<SimpleObject>()); //throws
            }
        }

class SimpleObject{public string test { get; set; }}
Run Code Online (Sandbox Code Playgroud)

我得到的例外是:"事务与命令的连接无关"在OrmLite的那一行周围失败.但是,我根本不应该参与交易.

当我使用SQL Server作为提供程序时,代码就像

new OrmLiteConnectionFactory(
                    @"Data Source=.\SQLEXPRESS;Initial Catalog=TestEmpty;Persist Security Info=True;User ID=db;Password=db;",
                     false, SqlServerDialect.Provider, true);*/
Run Code Online (Sandbox Code Playgroud)

这个测试工作正常.

我不正确地结束交易吗?它是ServiceStack.OrmLite中的错误吗?

koj*_*ojo 7

事实证明,我目前正在使用的版本已经报告修复了类似的问题.在将我的测试与传递的测试进行比较后,我发现我并没有Dispose()我的交易.

最后答案是:必须处理交易.如果不是,则在使用SQLite时代码将失败.

以下测试通过:

        public void Can_query_after_transaction_is_committed()
        {
            var connection = new OrmLiteConnectionFactory(":memory:", true, SqliteDialect.Provider, true);
            using (var db = connection.OpenDbConnection())
            {
                db.DropAndCreateTable<SimpleObject>();
                using (var trans = db.OpenTransaction()) 
                {
                   db.Insert(new SimpleObject {test = "test"});
                   trans.Commit();
                }
                Assert.DoesNotThrow(()=> db.Select<SimpleObject>());
            }
        }
Run Code Online (Sandbox Code Playgroud)